pgfplots Balkendiagramm mit Fehlerbalken und Beschriftung

Tabellen und Grafiken erstellen und anordnen


eduardinho
Forum-Anfänger
Forum-Anfänger
Beiträge: 25
Registriert: Mi 22. Aug 2012, 13:06

pgfplots Balkendiagramm mit Fehlerbalken und Beschriftung

Beitrag von eduardinho »

Hallo zusammen,

ich versuche gerade von Excel-Diagrammen auf pgfplots in Latex umzusteigen. Ich habe nun folgendes Problem: Ich habe ein Balkendiagramm mit jeweils 3 zusammengefassten Balken, diese haben jeweils eine Standardabweichung, die abgebildet werden soll. Außerdem soll der y-Wert bei jedem Balken angegeben werden. Wenn ich diesen mit
nodes near coords
angebe, überschneidet sich dieser mit den Fehlerbalken. Also habe ich versucht mit den Befehlen
nodes near coords align={...}, 
every node near coord/.append style={...}
versucht die Beschriftung um 45° zu rotieren und über dem Fehlerbalken zu platzieren. Leider habe ich das nicht hingekriegt. Das pgfplots Manual hat mir auch nur bedingt weitergeholfen.

Es wäre toll, wenn mir jemand helfen könnte,
- die Werte um 45° gedreht über den Fehlerbalken zu platzieren
- einzelne Werte manuell bei großen Standardabweichungen zu verschieben, geht das? (Standardabweichung bei Stamm5 im Bsp. deutlich höher als bei den restlichen Daten)
- alternativ die Werte evtl. in der Mitte des Balkens anzuzeigen.

Nun der Code, soweit ich gekommen bin:
\documentclass{scrartcl}
\usepackage{pgfplots}
\pgfplotsset{/pgf/number format/use comma}
\usetikzlibrary{patterns}

\begin{filecontents*}{data.txt}
Name	x	T1	st1	T2	st2	T3	st3
Stamm1	1	80	4.5	70	3.2	65	2	
Stamm2	2	50	2	45	0.5	42	1
Stamm3	3	45	3	40	1	35	3
Stamm4	4	60	1.5	50	1.5	48	1.5	
Stamm5	5	150	8	154	15	149	7
Stamm6	6	140	7	150	3	148	4
\end{filecontents*}

\begin{document}

\begin{tikzpicture}
   \begin{axis}[
   	ybar=1pt,  %configures bar shift
   	ylabel={Dauer},
	width=12cm,
    xticklabels from table={data.txt}{Name},   	
   	xtick=data,
   	ticklabel style={/pgf/number format/.cd, use comma, 1000 sep = {}},
   	nodes near coords,
	nodes near coords align={rotate=45, /pgf/number format/precision=0}, 
%    every node near coord/.append style={
%    rotate=45,
%      font=\scriptsize,
%      /pgf/number format/precision=0,
%      anchor=north,       
%		at={(\coordindex,\coordindex+5)}},      
%   	enlargelimits=auto,
	ymajorgrids=true,
	legend pos= north west,% Legende oben links in Abb.
	legend cell align=right% Rechtsbündige Ausrichtung der Legende
	] 
     \addplot
		[draw = blue,
		 fill = blue!30!white,
         error bars/.cd, 
         y dir=both, 
         y explicit, 
         error mark=triangle*,
         error bar style={color=black}]  
       table[
         x=x, 
         y=T1, 
         y error=st1
       ] 
     {data.txt};
     \addlegendentry{T1};
     \addplot
		[draw = red,
		 fill=white,
		 postaction={pattern=north east lines,pattern color=red!30!white},
         error bars/.cd, 
         y dir=both, 
         y explicit, 
         error mark=triangle*,
         error bar style={color=black}]  
       table[
         x=x, 
         y=T2, 
         y error=st2
       ] 
     {data.txt};
     \addlegendentry{T2};
     \addplot
		[draw = green,
		 fill=white,
		 postaction={pattern=north west lines,pattern color=green!30!white},
         error bars/.cd, 
         y dir=both, 
         y explicit, 
         error mark=triangle*,
         error bar style={color=black}]  
       table[
         x=x, 
         y=T3, 
         y error=st3
       ] 
     {data.txt};     
     \addlegendentry{T3};           
   \end{axis} 
\end{tikzpicture}

\end{document}
Vielen Dank für eure Hilfe

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

Beitrag von esdd »

Hier ist ein Vorschlag, der einigermaßen passen sollte:


\documentclass{scrartcl} 
\usepackage{pgfplots} 
\pgfplotsset{
  compat=1.12,
  /pgf/number format/use comma
} 
\usetikzlibrary{patterns} 

\begin{filecontents*}{data.txt} 
 Name   x   T1   st1   T2   st2   T3   st3 
 Stamm1   1   80   4.5   70   3.2   65   2   
 Stamm2   2   50   2   45   0.5   42   1 
 Stamm3   3   45   3   40   1   35   3 
 Stamm4   4   60   1.5   50   1.5   48   1.5   
 Stamm5   5   150   8   154   15   149   7 
 Stamm6   6   140   7   150   3   148   4 
\end{filecontents*} 

\begin{document} 

\begin{tikzpicture} 
    \begin{axis}[ 
       ybar=2pt,  %configures bar shift 
       ylabel={Dauer}, 
    width=12cm, 
     xticklabels from table={data.txt}{Name},       
       xtick=data, 
       ticklabel style={/pgf/number format/.cd, use comma, 1000 sep = {}}, 
       nodes near coords, 
      every node near coord/.append style={
          yshift=transformdirectiony(\myshift+1),
          anchor=south west,
          rotate=45,
          font=\scriptsize
        },
    ymajorgrids=true, 
    legend pos= north west,% Legende oben links in Abb. 
    legend cell align=right% Rechtsbündige Ausrichtung der Legende 
    ] 
      \addplot 
       [draw = blue, 
        fill = blue!30!white, 
          error bars/.cd, 
          y dir=both, 
          y explicit, 
          error mark=triangle*, 
          error bar style={color=black}]   
        table[ 
          x=x, 
          y=T1, 
          y error=st1,
          visualization depends on=1.25*\thisrow{st1} \as \myshift,
        ] 
      {data.txt}; 
      \addlegendentry{T1}; 
      \addplot 
       [draw = red, 
        fill=white, 
        postaction={pattern=north east lines,pattern color=red!30!white}, 
          error bars/.cd, 
          y dir=both, 
          y explicit, 
          error mark=triangle*, 
          error bar style={color=black}]   
        table[ 
          x=x, 
          y=T2, 
          y error=st2,
          visualization depends on=1.25*\thisrow{st2} \as \myshift,
        ] 
      {data.txt}; 
      \addlegendentry{T2}; 
      \addplot 
       [draw = green, 
        fill=white, 
        postaction={pattern=north west lines,pattern color=green!30!white}, 
          error bars/.cd, 
          y dir=both, 
          y explicit, 
          error mark=triangle*, 
          error bar style={color=black}]   
        table[ 
          x=x, 
          y=T3, 
          y error=st3,
          visualization depends on=1.25*\thisrow{st3} \as \myshift,
        ] 
      {data.txt};     
      \addlegendentry{T3};           
    \end{axis} 
\end{tikzpicture} 
\end{document}
Gruß
Elke

Bild
Dateianhänge
gl_barpler.png
gl_barpler.png (25.95 KiB) 4253 mal betrachtet

eduardinho
Forum-Anfänger
Forum-Anfänger
Beiträge: 25
Registriert: Mi 22. Aug 2012, 13:06

Beitrag von eduardinho »

Perfekt, so hab ich mir das gewünscht.

Danke Elke.

Zwei kleine Fragen habe ich noch:
- wie kann ich die Beschriftung noch ein wenig nach links verschieben? habe das auf ein paar andere Daten angewendet, wo der "linke Balken" recht deutlich kleiner ist als der mittlere und somit die Beschriftung in den mittleren Balken hineinragt.

- und vielleicht noch etwas doofe Frage: wie kann ich die kleinen Striche oben umdrehen, also dass sie nach unten in das Diagramm hineinragen? im manual scheinen die alle automatisch schon nach unten zu zeigen.
Dateianhänge
Unbenannt1.PNG
Unbenannt1.PNG (2.7 KiB) 4163 mal betrachtet
Unbenannt2.PNG
Unbenannt2.PNG (9.11 KiB) 4230 mal betrachtet

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

Beitrag von esdd »

eduardinho hat geschrieben: - wie kann ich die Beschriftung noch ein wenig nach links verschieben? habe das auf ein paar andere Daten angewendet, wo der "linke Balken" recht deutlich kleiner ist als der mittlere und somit die Beschriftung in den mittleren Balken hineinragt.
Du kannst innerhalb von every node near coord/.append style noch xshift=-1mm verwenden, um die Beschriftung 1mm nach links zu schieben. Aber besser wäre dann vielleicht doch rotate=90] in Kombination mit anchor=west.

[quote="eduardinho"]
- und vielleicht noch etwas doofe Frage: wie kann ich die kleinen Striche oben umdrehen, also dass sie nach unten in das Diagramm hineinragen? im manual scheinen die alle automatisch schon nach unten zu zeigen.[/quote]

error mark options={rotate=30} hinter error mark=triangle*

Gruß
Elke

eduardinho
Forum-Anfänger
Forum-Anfänger
Beiträge: 25
Registriert: Mi 22. Aug 2012, 13:06

Beitrag von eduardinho »

Danke sehr.
der erste Punkt funktioniert gut.

Beim zweiten meinte ich aber nicht die error bars, sondern sozusagen im Prinzip die y major grids, die zwar ausgeblendet sind, wo aber doch die "kurzen Stummel" aus dem Diagramm herausragen, und ich hätte gerne die kurzen Stummel in das Diaramm hineinragen

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

Beitrag von esdd »

Ach Du meinst die xticks. Wenn Du die oben ausblenden willst, dann nimm xtick pos=left. Wenn sie nach innen zeigen sollen, dann xtick align=inside. Allerdings zeigen die dann oben und unten nach innen und unten liegen sie unter den Plots, sind also nicht mehr sichtbar.

Gruß
Elke

eduardinho
Forum-Anfänger
Forum-Anfänger
Beiträge: 25
Registriert: Mi 22. Aug 2012, 13:06

Beitrag von eduardinho »

ah xticks nennt man die also :)

klasse, danke dir vielmals für die ganze Hilfe.

Antworten