PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Tikz Säulendiagramm Problem: Balken verschoben



sailor79
21-05-2011, 09:01
Guten Morgen zusammen.
Habe mit pgfplots/tikz das seltsame Problem, dass die Balken in einem Säulendiagramm nicht zentriert an der x-Achse sondern nach rechts und links verschoben sind.
Im Anhang ein pdf zur Ansicht.
Der Code für das Minimalbeispiel lautet


\documentclass[a4paper,ngerman]{report}
\usepackage[T1]{fontenc}
\usepackage[latin9]{inputenc}
\usepackage{babel}
\usepackage{pgfplots}

\begin{document}

\pgfplotsset{width=18cm,compat=1.3}
\begin{tikzpicture}[scale=0.82]

\begin{axis}[
%symbolic x coords={T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13 ,T14,T15,T16,T17,T18,T19},
xticklabel style={rotate=45,anchor=near xticklabel},
xtick={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,1 8,19},
xticklabels={T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T1 2,T13,T14,T15,T16,T17,T18,T19},
ylabel=ylabel,
xlabel=xlabel,
%enlargelimits=0.07,
legend style={at={(0.16,0.98)}, %0.6,-0.15
anchor=north west,legend columns=3},
ybar=2pt,
bar width=12pt,
%nodes near coords,
%axis y line*=left,
ymin=0,
ymax=16.5,
point meta=explicit,]

\addplot[draw=green!60!black,fill=green!30!white,semithick]
coordinates {
(1,16)
(2,16)
(3,14)
(4,8)
(5,8)
(6,8)
(7,7)
(8,5)
(9,5)
(10,4)
(11,3)
(12,3)
(13,3)
(14,3)
(15,3)};
\addplot[draw=red,fill=red!30!white,semithick]
coordinates {
(16,2)
(17,1)
(18,1)
(19,1)};

\draw [blue!70!white,very thick] (axis cs:0,3) -- (axis cs:20, 3);
\node
[pin=90:({min}),fill=green,circle,scale=0.4]
(aninnernode1) at (axis cs:18,3) {};

\legend{Gruppe A,Gruppe B}

\end{axis}
\end{tikzpicture}

\end{document}

Kann mir jemand helfen?

Gruß
sailor

esdd
21-05-2011, 14:54
Hallo,

ich habe mal in die Doku geschaut. Die Balken werden nach links und rechts verschoben, damit du zu einem x-Wert zwei verschiedene Balken zeichnen kannst. Lass einfach ybar bei den Optionen für axis weg und schreib es dafür bei beiden \addplot zu den Optionen hinzu. Wenn du die xticks sichtbar gezeichnet bekommen willst, dann ergänze bei den axis Optionen noch xtick align=outside.



\documentclass{report}
\usepackage{pgfplots}

\begin{document}
\pgfplotsset{width=18cm,compat=1.3}
\begin{tikzpicture}[scale=0.82]
\begin{axis}[%
xticklabel style={rotate=45,anchor=near xticklabel},%
xtick={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,1 8,19},%
xtick align=outside,%
xticklabels={T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T1 2,T13,T14,T15,T16,T17,T18,T19},%
ylabel=ylabel,xlabel=xlabel,%
legend style={at={(0.16,0.98)},anchor=north west,legend columns=-1},%
bar width=12pt,%
ymin=0,ymax=16.5,%
point meta=explicit%
]
\addplot[draw=green!60!black,fill=green!30!white,semithick, ybar]
coordinates {(1,16) (2,16) (3,14) (4,8) (5,8) (6,8) (7,7) (8,5) (9,5)
(10,4) (11,3) (12,3) (13,3) (14,3) (15,3)};
\addplot[draw=red,fill=red!30!white,semithick,ybar]
coordinates {(16,2) (17,1) (18,1) (19,1)};
\draw[blue!70!white,very thick] (axis cs:0,3) -- (axis cs:20, 3);
\node[pin=90:({min}),fill=green,circle,scale=0.4]
(aninnernode1) at (axis cs:18,3) {};
\legend{Gruppe A,Gruppe B}
\end{axis}
\end{tikzpicture}
\end{document}
Gruß
Elke

sailor79
21-05-2011, 16:14
Hallo Elke,
auch hier vielen Dank! Das hilft mir sehr und funktioniert wunderbar.:D

Ich habe nur ein Problemfall, und zwar wenn ich xbar (Säulen quer) benutzte.
a)In meiner (alten Version) sind zwar die Balken verschoben, aber dafür werden die richtigen Werte an die Balken geschrieben.
b)Wende ich Deinen Tip an, sind die Balken zentriert, es werden aber andere Werte (die Abstandswerte) angezeigt. Das liegt sicher nicht an Deiner Lösung, sondern an einem Denkfehler meinerseits. Vielleicht hast du hier auch ne Idee?
(Sehe kurz vor der Abgabe einfach die Bäume in Wald nicht mehr ;-)

MB zu a)

\documentclass[a4paper]{report}
\usepackage[T1]{fontenc}
\usepackage[latin9]{inputenc}
\usepackage[ngerman]{babel}
\usepackage{pgfplots}


\begin{document}

\pgfplotsset{width=15cm,compat=1.3}
\begin{tikzpicture}[scale=0.72]

\begin{axis}[
%xticklabel style={rotate=45,anchor=near xticklabel},
ytick={1,2,3,4,5,6,7,8},
yticklabels={TT43,TT1,TTL2,TTL3,TTL4,TTL2,TTTT BL2,TTTBL2},
ytick align=outside,%
xlabel=Frequenzen $F_{co}$ in 1/s,
ylabel=xTyp,
%enlargelimits=0.07,
xbar,
%ybar=0pt,
bar width=12pt,
nodes near coords,
xmin=0,
xmax=0.5,
legend style={at={(0.6,0.98)}, %0.6,-0.15
anchor=north west,legend columns=3},
]
\addplot [draw=red,fill=red!30!white,semithick] coordinates {
(0.3333,1)};
\addplot [draw=green!60!black,fill=green!30!white,semithick] coordinates {
(0.3332,2)
(0.2111,3)
(0.1212,4)
(0.2323,5)
(0.4444,6)
(0.4455,7)
(0.1222,8)};

\legend{AB,CD,}

\end{axis}

\end{tikzpicture}

\end{document}

MB zu b)

\documentclass[a4paper]{report}
\usepackage[T1]{fontenc}
\usepackage[latin9]{inputenc}
\usepackage[ngerman]{babel}
\usepackage{pgfplots}


\begin{document}

\pgfplotsset{width=15cm,compat=1.3}
\begin{tikzpicture}[scale=0.72]

\begin{axis}[
%xticklabel style={rotate=45,anchor=near xticklabel},
ytick={1,2,3,4,5,6,7,8},
yticklabels={TT43,TT1,TTL2,TTL3,TTL4,TTL2,TTTT BL2,TTTBL2},
ytick align=outside,%
xlabel=Frequenzen $F_{co}$ in 1/s,
ylabel=xTyp,
%enlargelimits=0.07,
%xbar,
%ybar=0pt,
bar width=12pt,
nodes near coords,
xmin=0,
xmax=0.5,
legend style={at={(0.6,0.98)}, %0.6,-0.15
anchor=north west,legend columns=3},
]
\addplot [draw=red,fill=red!30!white,semithick,xbar] coordinates {
(0.3333,1)};
\addplot [draw=green!60!black,fill=green!30!white,semithick, xbar] coordinates {
(0.3332,2)
(0.2111,3)
(0.1212,4)
(0.2323,5)
(0.4444,6)
(0.4455,7)
(0.1222,8)};

\legend{AB,CD,}

\end{axis}

\end{tikzpicture}

\end{document}

Anbei die 2 Ausgabe der Minimalbeispiel

esdd
21-05-2011, 17:00
Hallo,
in der Doku habe ich gefunden, dass für die Ausgabe der Werte die Option "nodes near coords" zuständig ist. Nimm die auch bei axis raus und schreibe sie hinter xbar bei den Optionen der \pgfplot hinzu.


\documentclass{report}
\usepackage{pgfplots}

\begin{document}
\pgfplotsset{width=15cm,compat=1.3}
\begin{tikzpicture}[scale=0.72]
\begin{axis}[%
ytick={1,2,3,4,5,6,7,8},%
yticklabels={TT43,TT1,TTL2,TTL3,TTL4,TTL2,TTTT BL2,TTTBL2},%
ytick align=outside,%
xlabel=Frequenzen $F_{co}$ in 1/s,%
ylabel=xTyp,%
bar width=12pt,%
xmin=0,xmax=0.5,%
legend style={at={(0.6,0.98)},%
anchor=north west,legend columns=-1},%
]
\addplot[draw=red,fill=red!30!white,semithick,xbar,nodes near coords]%
coordinates{(0.3333,1)};
\addplot[draw=green!60!black,fill=green!30!white,semithick, xbar,nodes near coords]%
coordinates {(0.3332,2) (0.2111,3) (0.1212,4) (0.2323,5)%
(0.4444,6) (0.4455,7) (0.1222,8)};
\legend{AB,CD,}
\end{axis}
\end{tikzpicture}
\end{document}
Gruß
Elke

sailor79
21-05-2011, 17:05
Vielen Dank.

esdd
21-05-2011, 17:15
Alternativ kann man auch bei axis die Option point meta=x ergänzen und nodes near coords dahinter stehen lassen. Mit nodes near coords align=horizontal lässt sich die Beschriftung der Noden etwas anders ausrichten.

\documentclass{report}
\usepackage{pgfplots}

\begin{document}
\pgfplotsset{width=15cm,compat=1.3}
\begin{tikzpicture}[scale=0.72]
\begin{axis}[%
ytick={1,2,3,4,5,6,7,8},%
yticklabels={TT43,TT1,TTL2,TTL3,TTL4,TTL2,TTTT BL2,TTTBL2},%
ytick align=outside,%
xlabel=Frequenzen $F_{co}$ in 1/s,%
ylabel=xTyp,%
bar width=12pt,%
xmin=0,xmax=0.5,%
legend style={at={(0.6,0.98)},%
anchor=north west,legend columns=-1},
point meta=x,
nodes near coords,
nodes near coords align=horizontal%
]
\addplot[draw=red,fill=red!30!white,semithick,xbar]%
coordinates{(0.3333,1)};
\addplot[draw=green!60!black,fill=green!30!white,semithick, xbar]%
coordinates {(0.3332,2) (0.2111,3) (0.1212,4) (0.2323,5)%
(0.4444,6) (0.4455,7) (0.1222,8)};
\legend{AB,CD,}
\end{axis}
\end{tikzpicture}
\end{document}

sailor79
21-05-2011, 17:24
Hallo Elke,
das klappt leider nicht, weil ich dann wieder das ursprüngliche Problem mit der Beschriftung mit falschen Werten habe.

Aber ich suche gerade noch nach einer Möglichkeit, das 4 statt 2 Nachkommastellen angezeigt werden.
Allerdings komme ich mit


xticklabel style={ /pgf/number format/fixed, /pgf/number format/precision=4},
bzw. yticklabel..

nicht weiter.

esdd
21-05-2011, 19:25
Hallo,

also bei mir hat der angegebene Code die richtigen Beschriftungen geliefert, aber es reicht ja, wenn eine Version funktioniert ;)

Du schreibst jetzt zwar was von den xticklabels, willst aber vermutlich die Beschriftung neben den einzelnen Balken mit 4 Nachkommastellen haben?


\documentclass{report}
\usepackage{pgfplots}

\begin{document}
\pgfplotsset{width=15cm,compat=1.3}
\begin{tikzpicture}[scale=0.72]
\pgfplotsset{myplotx/.style={%
semithick,%
xbar,%
nodes near coords={\pgfmathprintnumber[fixed,precision=4]{\pgfplotspointmeta}},
nodes near coords align=horizontal%
}}
\begin{axis}[%
ytick={1,2,3,4,5,6,7,8},%
yticklabels={TT43,TT1,TTL2,TTL3,TTL4,TTL2,TTTT BL2,TTTBL2},%
ytick align=outside,%
xlabel=Frequenzen $F_{co}$ in 1/s,%
ylabel=xTyp,%
bar width=12pt,%
xmin=0,xmax=0.5,%
legend style={at={(0.6,0.98)},%
anchor=north west,legend columns=-1},
]
\addplot[draw=red,fill=red!30!white,myplotx]%
coordinates{(0.3333,1)};
\addplot[draw=green!60!black,fill=green!30!white,myplotx]%
coordinates {(0.3332,2) (0.2111,3) (0.1212,4) (0.2323,5)%
(0.4444,6) (0.4455,7) (0.1222,8)};
\legend{AB,CD}
\end{axis}
\end{tikzpicture}
\end{document}

Ich habe dabei jetzt einfach für die ganzen Optionen, die bei beiden addplot stehen, den myplotx/.style definiert.

Gruß
Elke

sailor79
21-05-2011, 19:47
Das ist genau das, was ich gesucht habe.

Allerbesten Dank!