Horizontales Balkendiagramm

Tabellen und Grafiken erstellen und anordnen


pauabaer
Forum-Fortgeschrittener
Forum-Fortgeschrittener
Beiträge: 63
Registriert: Sa 19. Sep 2015, 00:17

Horizontales Balkendiagramm

Beitrag von pauabaer »

Guten Abend Leute,

ich versuche mich derzeit am Erstellen von Diagrammen mittels Latex resp. pgfplots/tikz..
Soweit bin ich ganz zufrieden. Mein Minimalbeispiel gibt schon den richtigen Weg vor :)
\documentclass[border=10pt]{standalone}
\usepackage{pgfplots}

\begin{document}
	\begin{tikzpicture}
	\begin{axis}[title  = ,
	xbar,
	y axis line style = { opacity = 0 },
	axis x line       = none,
	tickwidth         = 0pt,
	enlarge y limits  = 1.5,
	enlarge x limits  = 0.02,
	symbolic y coords = {Wittmann et. al, Zhao et. al},
	nodes near coords,
	reverse legend,
	legend style={draw=none,legend cell align=left},
	legend style={at={(1,1)},xshift=-2.5cm,anchor=north west},
	]
	\addplot coordinates { (134.2,Wittmann et. al)         (0,Zhao et. al)};
	\addplot coordinates { (43.9,Wittmann et. al)         (134,Zhao et. al)};
	\legend{Referenzbeton, Protectosil MH50 (2\%)}
	\end{axis}
	\end{tikzpicture}
\end{document}
Jetzt hätte ich gerne Anpassungen, die ich auch durch probieren bisher nicht hinbekomme.
- Zum einen Frage ich mich warum ich vier Einträge habe, wenn ich doch nur zwei definiert habe
- Zum anderen würde ich gerne wissen, wie ich andere Farben einbinden und ob man die Farben schwarz darstellen kann
- Dann würde ich gerne die Null durch den Text "keine Angabe" ersetzen. Ist dies möglich?

Danke für eure Hilfe.

Gruß
pauabaer[/list]

Bartman
Forum-Meister
Forum-Meister
Beiträge: 2466
Registriert: Do 16. Jul 2009, 21:41
Wohnort: Hessische Provinz

Re: Horizontales Balkendiagramm

Beitrag von Bartman »

\documentclass{standalone}
\usepackage{pgfplots}
\usepackage{siunitx}

\pgfplotsset{
	compat=newest,
	/pgf/number format/.cd, use comma
}

\begin{document}
\begin{tikzpicture}
\begin{axis}[
	xbar,
	y axis line style = { opacity = 0 },
	axis x line       = none,
	tickwidth         = 0pt,
	enlarge y limits  = 1.5,
	enlarge x limits  = 0.02,
	symbolic y coords = {Wittmann et. al, Zhao et. al},
	ytick=data, % verringert die vier Einträge auf zwei
	nodes near coords,
	reverse legend,
	legend style={
		draw=none,
		legend cell align=left,
		at={(1,1)},
		xshift=-2.5cm,
		anchor=north west
	}
]
\addplot [fill=black]   coordinates { (134.2,Wittmann et. al) (  0,Zhao et. al) }; % Änderung der Füllfarbe
\addplot [fill=gray!40] coordinates { ( 43.9,Wittmann et. al) (134,Zhao et. al) };
\legend{Referenzbeton, Protectosil MH50 (\SI{2}{\percent})}
\end{axis}
\end{tikzpicture}
\end{document}
Bild

Zu Deinem dritten Anliegen fällt mir nichts ein.
Dateianhänge
balkendiagramm.png
balkendiagramm.png (21.58 KiB) 4018 mal betrachtet

pauabaer
Forum-Fortgeschrittener
Forum-Fortgeschrittener
Beiträge: 63
Registriert: Sa 19. Sep 2015, 00:17

Beitrag von pauabaer »

Vielen Dank schonmal! Sieht jetzt wesentlich besser aus.

Gibt es eine Möglichkeit den Zahlenwerten auch zwei Nachkommastellen zu spendieren?

Könnte ich statt einem Text dann einfach die 0 weglassen?

Gruß
pauabaer

Bartman
Forum-Meister
Forum-Meister
Beiträge: 2466
Registriert: Do 16. Jul 2009, 21:41
Wohnort: Hessische Provinz

Beitrag von Bartman »

pauabaer hat geschrieben:Gibt es eine Möglichkeit den Zahlenwerten auch zwei Nachkommastellen zu spendieren?
Ich habe zerofill eingefügt, damit die zwei Nachkommastellen im Beispiel erkennbar sind.

Für die mitlesenden Profis: Ich wollte die drei Angaben erst bspw. mit xticklabel setzen, aber es führte zu keiner sichtbaren Änderung.
\documentclass{standalone}
\usepackage{pgfplots}
\usepackage{siunitx}

\pgfplotsset{
	compat=newest,
	/pgf/number format/.cd, use comma
}

\begin{document}
\begin{tikzpicture}
\begin{axis}[
	xbar,
	y axis line style = { opacity = 0 },
	axis x line       = none,
	tickwidth         = 0pt,
	enlarge y limits  = 1.5,
	enlarge x limits  = 0.02,
	symbolic y coords = {Wittmann et. al, Zhao et. al},
	ytick=data, % verringert die vier Einträge auf zwei
	nodes near coords,
	reverse legend,
   /pgf/number format/fixed,
	/pgf/number format/zerofill,
	/pgf/number format/precision=2,
	legend style={
		draw=none,
		legend cell align=left,
		at={(1,1)},
		xshift=-2.5cm,
		anchor=north west
	}
]
\addplot [fill=black]   coordinates { (134.2,Wittmann et. al) (  0,Zhao et. al) }; % Änderung der Füllfarbe
\addplot [fill=gray!40] coordinates { ( 43.9,Wittmann et. al) (134,Zhao et. al) };
\legend{Referenzbeton, Protectosil MH50 (\SI{2}{\percent})}
\end{axis}
\end{tikzpicture}
\end{document}
pauabaer hat geschrieben:Könnte ich statt einem Text dann einfach die 0 weglassen?
Wenn es einen Weg gibt, ist er mir unbekannt. Ich habe vor längerer Zeit einmal ein Balkendiagramm im Netz gefunden und angepasst, welches nur mit TikZ erstellt wurde, da war etwas in der Art möglich.

pauabaer
Forum-Fortgeschrittener
Forum-Fortgeschrittener
Beiträge: 63
Registriert: Sa 19. Sep 2015, 00:17

Beitrag von pauabaer »

Super vielen Dank :)

Mal sehen wie ich das mit dem Balken löse, für den es keine Wertangabe gibt.. Vielleicht findet sich ja ein vernünftiger Weg.

Gruß
pauabaer

pauabaer
Forum-Fortgeschrittener
Forum-Fortgeschrittener
Beiträge: 63
Registriert: Sa 19. Sep 2015, 00:17

Beitrag von pauabaer »

Eine Möglichkeit auf die ich mich einlassen könnte :) wäre folgende:
\documentclass{standalone}
\usepackage{pgfplots}
\usepackage{siunitx}

\pgfplotsset{
	compat=newest,
	/pgf/number format/.cd, use comma
}

\begin{document}
	\begin{tikzpicture}
	\begin{axis}[
	xbar,
	xtick={0,30,...,150},
	axis x line       = bottom,
	y axis line style = { opacity = 0 },
	tickwidth         = 5pt,
	enlarge y limits  = 1.5,
	enlarge x limits  = 0.02,
	symbolic y coords = {Wittmann et. al, Zhao et. al},
	ytick=data, % verringert die vier Einträge auf zwei
	%nodes near coords,
	reverse legend,
	/pgf/number format/fixed,
	%/pgf/number format/zerofill,
	%/pgf/number format/precision=2,
	legend style={
		draw=none,
		legend cell align=left,
		at={(1,1)},
		xshift=-2.5cm,
		anchor=north west
	}
	]
	\addplot [fill=black]   coordinates { (134.2,Wittmann et. al) (  0,Zhao et. al) }; % Änderung der Füllfarbe
	\addplot [fill=gray!40] coordinates { ( 43.9,Wittmann et. al) (134,Zhao et. al) };
	\legend{Referenzbeton, Protectosil MH50 (\SI{2}{\percent})}
	\end{axis}
	\end{tikzpicture}
\end{document}
Allerdings stören mich hier zwei Sachen:
1. Die ticks am (Anfang und) Ende der Balken
2. Der große Abstand zwischen Achse und unterstem Balken

Gibt es die Möglichkeit das beides noch anzupassen?

Gruß
Dateianhänge
Horizontales Balkendiagramm.png
Horizontales Balkendiagramm.png (3.9 KiB) 4022 mal betrachtet

esdd
Forum-Meister
Forum-Meister
Beiträge: 2561
Registriert: So 7. Feb 2010, 16:36

Beitrag von esdd »

Das Zeichnen der ytick kannst Du mit
ytick style={draw=none}
verhindern.

Den Abstand der Balken zur x-Achse kannst Du verringern, in dem Du die Höhe verkleinerst
height=.6*\axisdefaultheight,
width=\axisdefaultwidth,
und enlarge y limits kleiner wählst
enlarge y limits  = .4,
Dann musst Du aber dafür die Legende etwas weiter oben positionieren.
\documentclass{standalone} 
\usepackage{pgfplots}
\usepackage{siunitx} 

\pgfplotsset{ 
    compat=newest, 
    /pgf/number format/.cd, use comma 
} 

\begin{document} 
    \begin{tikzpicture} 
    \begin{axis}[ 
    height=.6*\axisdefaultheight,
    width=\axisdefaultwidth,
    xbar, 
    xtick={0,30,...,150}, 
    axis x line       = bottom, 
    y axis line style = { opacity = 0 }, 
    ytick style={draw=none},
    enlarge y limits  = .4, 
    enlarge x limits  = 0.02, 
    symbolic y coords = {Wittmann et. al, Zhao et. al}, 
    ytick=data, % verringert die vier Einträge auf zwei 
    %nodes near coords, 
    reverse legend, 
    /pgf/number format/fixed, 
    %/pgf/number format/zerofill, 
    %/pgf/number format/precision=2, 
    legend style={ 
       draw=none, 
       legend cell align=left, 
       at={(1,1)}, 
       xshift=-2.5cm, 
       anchor=south west 
    }
    ] 
    \addplot [fill=black]   coordinates { (134.2,Wittmann et. al) (  0,Zhao et. al) }; % Änderung der Füllfarbe 
    \addplot [fill=gray!40] coordinates { ( 43.9,Wittmann et. al) (134,Zhao et. al) }; 
    \legend{Referenzbeton, Protectosil MH50 (\SI{2}{\percent})} 
    \end{axis} 
    \end{tikzpicture} 
\end{document}
Aber wenn ich es richtig sehe, willst Du die x-Achse gar nicht, sondern suchst vermutlich etwas wie
nodes near coords={\ifdim \pgfplotspointrawx pt=0pt keine Angabe \else \pgfmathprintnumber{\pgfplotspointrawx}\fi},
every axis plot/.append style={visualization depends on= rawx \as \pgfplotspointrawx},
Wobei man den Platz unterhalb der Balken trotzdem verringern sollte. Also beispielsweise
\documentclass{standalone} 
\usepackage{pgfplots} 
\usepackage{siunitx} 

\pgfplotsset{ 
    compat=newest, 
    /pgf/number format/.cd, use comma 
} 

\begin{document} 
\begin{tikzpicture} 
\begin{axis}[ 
    height=.5*\axisdefaultheight,
    width=\axisdefaultwidth,
    xbar, 
    y axis line style = { opacity = 0 }, 
    axis x line       = none, 
    tickwidth         = 0pt, 
    enlarge y limits  = .4, 
    enlarge x limits  = 0.02, 
    symbolic y coords = {Wittmann et. al, Zhao et. al}, 
    ytick=data, 
    nodes near coords={\ifdim \pgfplotspointrawx pt=0pt keine Angabe \else \pgfmathprintnumber{\pgfplotspointrawx}\fi},
    every axis plot/.append style={visualization depends on= rawx \as \pgfplotspointrawx},
    reverse legend, 
    /pgf/number format/fixed, 
    /pgf/number format/zerofill, 
    /pgf/number format/precision=2, 
    legend style={ 
       draw=none, 
       legend cell align=left, 
       at={(1,1)}, 
       xshift=-2.5cm, 
       anchor=south west 
    },
] 
\addplot [fill=black]   coordinates { (134.2,Wittmann et. al) (  0,Zhao et. al) }; 
\addplot [fill=gray!40] coordinates { ( 43.9,Wittmann et. al) (134,Zhao et. al) }; 
\legend{Referenzbeton, Protectosil MH50 (\SI{2}{\percent})} 
\end{axis} 
\end{tikzpicture} 
\end{document}
Gruß
Elke

Bild
Dateianhänge
gl_nodesnearcoords.png
gl_nodesnearcoords.png (12.39 KiB) 4019 mal betrachtet

pauabaer
Forum-Fortgeschrittener
Forum-Fortgeschrittener
Beiträge: 63
Registriert: Sa 19. Sep 2015, 00:17

Beitrag von pauabaer »

Hi Elke! Besten Dank. Genauso wollte ich es ursprünglich. Super!

Danke auch für die einzelnen Befehle.

Jetzt hab ich noch eine Frage.
\documentclass{standalone}
\usepackage{pgfplots}
\usepackage{siunitx}

\pgfplotsset{
    compat=newest,
    /pgf/number format/.cd, use comma
}

\begin{document}
\begin{tikzpicture}
\begin{axis}[
    height=.5*\axisdefaultheight,
    width=\axisdefaultwidth,
    xbar,
    y axis line style = { opacity = 0 },
    axis x line       = none,
    tickwidth         = 0pt,
    enlarge y limits  = .4,
    enlarge x limits  = 0.02,
    symbolic y coords = {Wittmann et. al, Zhao et. al},
    ytick=data,
    nodes near coords={\ifdim \pgfplotspointrawx pt=0pt keine Angabe \else \pgfmathprintnumber{\pgfplotspointrawx}\fi},
    every axis plot/.append style={visualization depends on= rawx \as \pgfplotspointrawx},
    reverse legend,
    /pgf/number format/fixed,
    /pgf/number format/zerofill,
    /pgf/number format/precision=2,
    legend style={
       draw=none,
       legend cell align=left,
       at={(1,1)},
       xshift=-2.5cm,
       anchor=south west
    },
]
\addplot [fill=black]   coordinates { (134.2,Wittmann et. al) (  0,Zhao et. al) };
\addplot [fill=gray!40] coordinates { ( 134.2,Wittmann et. al) (134,Zhao et. al) }; % Habe den Wert gleichgesetzt
\legend{Referenzbeton, Protectosil MH50 (\SI{2}{\percent})}
\end{axis}
\end{tikzpicture}
\end{document}
Wenn ich im Datensatz nun zwei gleiche Werte (siehe Minimalbeispiel) habe, kann ich dann nur eine node und diese mittig einsetzen? Sonst wirkt das überladen mit den gleichen Werten..

Gruß
pauabaer
Dateianhänge
Horizontales Balkendiagramm.png
Horizontales Balkendiagramm.png (7.64 KiB) 4018 mal betrachtet

pauabaer
Forum-Fortgeschrittener
Forum-Fortgeschrittener
Beiträge: 63
Registriert: Sa 19. Sep 2015, 00:17

Beitrag von pauabaer »

Dann hätte ich noch eine Frage.
Hab auf Grundlage deiner Vorlage zwei weitere Balkendiagramme erstellt. Die möchte ich gerne als Abbildungen nebeneinander in die Arbeit integrieren (siehe Anhang).

Wie bekomme ich die Legende oberhalb der beiden Abbildungen und die einzelnen Einträge nebeneinander?
\documentclass{standalone}
\usepackage{pgfplots}
\usepackage{siunitx}

\pgfplotsset{
	compat=newest,
	/pgf/number format/.cd, use comma
}

\begin{document}
	\begin{tikzpicture}
	\begin{axis}[node font=\normalsize,
	height=1.3*\axisdefaultheight,
	width=\axisdefaultwidth,
	xbar,              
	xtick={0,50,...,500},
	axis x line=none,
	%axis y line=left, 
	ylabel=Metallseifendosierung in \%,
	y axis line style = { opacity = 00 },     
	tickwidth         = 0pt,
	enlarge y limits  = 0.5,
	enlarge x limits  = 0.02,
	symbolic y coords = {0, 0.5, 1},
	ytick=data, % verringert die vier Einträge auf zwei
	nodes near coords,
	reverse legend,
	legend style={
		draw=none,
		legend cell align=left,
		at={(1,1)},
		xshift=0cm,
		yshift=-2cm,
		anchor=south
	}
	]
	\addplot [fill=white] coordinates { ( 312,0) (52,0.5) (74,1) };
	\addplot [fill=gray!40] coordinates { ( 312,0) (91,0.5) (93,1) };
	\addplot [fill=gray] coordinates { ( 312,0) (79,0.5) (82,1) };
	\addplot [fill=black!85] coordinates { (312,0) ( 195,0.5) ( 76,1)}; % Änderung der Füllfarbe
	\legend{LIGAPHOB ZN101 Plus, LIGA Calciumstearat 860, Zinkstearat 101, LIGAPHOB ZN 502}
	\end{axis}
	\end{tikzpicture}
	
	\begin{tikzpicture}
	\begin{axis}[
	height=1.3*\axisdefaultheight,
	width=\axisdefaultwidth,
	xbar,              
	xtick={0,50,...,500},
	axis x line=none,
	%axis y line=left, 
	ylabel=Metallseifendosierung in \%,
	y axis line style = { opacity = 00 },     
	tickwidth         = 0pt,
	enlarge y limits  = 0.5,
	enlarge x limits  = 0.02,
	symbolic y coords = {0, 0.5, 1},
	ytick=data, % verringert die vier Einträge auf zwei
	nodes near coords,
	reverse legend,
	%legend style={
		%draw=none,
		%legend cell align=left,
		%at={(1,1)},
		%xshift=0cm,
		%yshift=-2cm,
		%anchor=south west
	%}
	]
	\addplot [fill=white] coordinates { ( 358,0) (189,0.5) (148,1) };
	\addplot [fill=gray!40] coordinates { ( 358,0) (212,0.5) (222,1) };
	\addplot [fill=gray] coordinates { ( 358,0) (192,0.5) (179,1) };
	\addplot [fill=black!85] coordinates { (358,0) ( 189,0.5) ( 171,1)}; % Änderung der Füllfarbe
	%\legend{LIGAPHOB ZN101 Plus, LIGA Calciumstearat 860, Zinkstearat 101, LIGAPHOB ZN 502}
	\end{axis}
	\end{tikzpicture}
\end{document}
Gibt es die Möglichkeit die "symbolic y coords" des zweiten Diagramms auszublenden?
Gruß
pauabaer
Dateianhänge
Horizontale Balken nebeneinander.png
Horizontale Balken nebeneinander.png (10.39 KiB) 4030 mal betrachtet

esdd
Forum-Meister
Forum-Meister
Beiträge: 2561
Registriert: So 7. Feb 2010, 16:36

Beitrag von esdd »

pauabaer hat geschrieben: Wenn ich im Datensatz nun zwei gleiche Werte (siehe Minimalbeispiel) habe, kann ich dann nur eine node und diese mittig einsetzen?
Automatisch dürfte das, wenn überhaupt, nur mit sehr großem Aufwand realisierbar sein. Du kannst den Wert allerdings auf dem gleichen Weg von der Ausgabe ausnehmen und statt dessen noch in der axis Umgebung eine Koordinate setzen, an der Du dann außerhalb von axis einen Node mit gewünschtem Inhalt einfügst. Ob der Aufwand im Verhältnis zum Nutzen steht, musst Du selbst beurteilen.

Zu der anderen Frage: Wenn die Diagramme nebeneinander stehen sollen, dann mache bitte ein Minimalbeispiel mit Deiner echten Klasse. Dann darf auch zwischen den beiden keine Leerzeile stehen ;-) Wie soll die Legende denn dann ausgerichtet sein? Zentriert?

Antworten