PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Kampf mit einem Säulendiagramm



Cerebellum
06-08-2013, 19:03
Nachdem ich mit Excel kläglich gescheitert bin (welch Wunder...), versuche ich ein Säulendiagramm mit pgfplots/tikz darzustellen. Momentan verrutschen aber die Balken scheinbar nach Lust und Laune, d. h., bei den angegebenen Koordinaten werden sie einmal mittig, dann rechtsbündig, dann linksbündig angeordnet - was mache ich falsch? Hinzu kommt, dass ich aufgrund der unters. Werte zwei y-Achsen benötige...

Mini:

\documentclass{scrreprt}
\usepackage{tikz}
\usepackage{pgfplots}


\begin{document}

\begin{tikzpicture}
%Linke Achse (Primärachse)
\begin{axis}[ybar, scale only axis, axis y line*=left, xmin=0, xmax=8, ymin=0, ymax=10,]
\addplot coordinates {(1,3)(5,1)}; %Zug
\addplot coordinates {(2,5)(6,2)}; %Biege
\end{axis}

%Rechte Achse (Sekachse)
\begin{axis}[ybar, scale only axis, axis y line*=right, axis x line=none, xmin=0, xmax=8, ymin=0, ymax=150]
\addplot coordinates {(3,100)(7,120)}; %Druck
\end{axis}
\end{tikzpicture}

\end{document}


Was mache ich falsch bzw. wer kann mir helfen? Pdf ist im Anhang.

Vielen Dank!

esdd
06-08-2013, 21:54
Hallo,

wenn in einem Säulendiagramm mehrere addplot vorkommen, dann sollen die ja nicht übereinander gezeichnet werden, falls sie gleiche x-Koordinaten haben. Deshalb wird in der ersten axis-Umgebung das erste addplot als blaue Säulen links von den Koordinaten und das zweite als rote Säulen rechts von den Koordinaten eingetragen. In der zweiten axis Umgebung steht nur ein addplot, was zu mittigen blauen Säulen führt.

Wenn alle Säulen mittig sein sollen und das addplot in der zweiten axis-Umgebung eine andere Farbe bekommen soll, kannst du dies wie folgt lösen:


\documentclass{scrreprt}

\usepackage{pgfplots}
\pgfplotsset{compat=1.8}


\begin{document}

\begin{tikzpicture}
%Linke Achse (Primärachse)
\begin{axis}[ybar, scale only axis, axis y line*=left, xmin=0, xmax=8, ymin=0, ymax=10,]
\addplot+[bar shift=0] coordinates {(1,3)(5,1)}; %Zug
\addplot+[bar shift=0] coordinates {(2,5)(6,2)}; %Biege
\end{axis}
%
%Rechte Achse (Sekachse)
\begin{axis}[ybar, scale only axis, axis y line*=right, axis x line=none, xmin=0, xmax=8, ymin=0, ymax=150]
\pgfplotsset{cycle list shift=2}
\addplot coordinates {(3,100)(7,120)}; %Druck
\end{axis}
\end{tikzpicture}

\end{document}

Gruß
Elke

Cerebellum
07-08-2013, 20:59
Hallo Elke,

danke für deine Antwort! Das wird aber sicher nicht meine letzte Frage sein, habe noch ein paar Problemchen mit dieser Grafik...

Cerebellum
10-08-2013, 14:09
Hallo,

ich habe nun verstanden, dass Latex bei solchen Diagrammen automatisch "mitdenkt" und auch meine Legende und Fehlerbalken schon selbst angepasst.

Nun möchte ich aber den Zähler für addplot für die zweite axis-Umgebung hochsetzen, damit das automatische Verrücken DOCH funktioniert. D.h. die zweite axis-Umgebung soll wissen, dass bereits zwei addplot-Befehle vorhanden sind und damit den bar shift entsprechend selbstständig einstellen. Gibt es dafür einen Befehl?

PS: ich finde es immer noch schwer, nach solchen Fragestellungen in der Anleitung von pfgplots zu suchen. Ich weiß zwar, was ich will, aber in dem riesigen PDF ein bestimmtes Problem zu finden, fällt mir schwer. Habt ihr dafür evt auch ein paar Tipps? (So dass ich mir mehr "selbst" helfen könnte...)

Viele Grüße,

Cerebellum

Cerebellum
20-08-2013, 19:53
Keiner eine Idee?
Kurz: ich suche in der zweiten axis-Umgebung einen Befehl, der sagt, dass schon zwei addplots vorhanden sind und so der bar shift automatisch gesetzt wird. Habe auch schon \numplots und \plotnum gefunden, aber ich weiß nicht, an welcher Stelle ich (welches?) verwenden kann? Das pgfplotsmanual hilft leider nicht!

esdd
21-08-2013, 12:20
Hallo,

dann braucht auch die erste axis-Umgebung die Info, dass es insgesamt 3 Plots sind. Da die Balken symmetrisch um den jeweiligen x-Wert verteilt werden, geht die Gesamtzahl der Plots in die Berechnung der Verschiebungen ein.

Du könntest einfach leere \addplots als Platzhalter einfügen, erhälst dafür dann aber mindestens Warnungen und ich weiß nicht, ob das weitere Nebenwirkungen hat.

\documentclass{scrreprt}
\usepackage{pgfplots}
\pgfplotsset{compat=1.8}
\begin{document}

\begin{tikzpicture}
\pgfplotsset{every axis/.style={ybar, scale only axis, xmin=0, xmax=8, ymin=0}}
%Linke Achse (Primärachse)
\begin{axis}[axis y line*=left, ymax=10]
\addplot coordinates {(1,3)(5,1)}; %Zug
\addplot coordinates {(1,5)(6,2)}; %Biege
\addplot coordinates {};
\end{axis}
%
%Rechte Achse (Sekachse)
\begin{axis}[axis y line*=right, axis x line=none, ymax=150]
\addplot coordinates {};
\addplot coordinates {};
\addplot coordinates {(1,100)(7,120)}; %Druck
\end{axis}
\end{tikzpicture}

\end{document}

Sauberer ist es dann wahrscheinlich bar shift direkt anzugeben:


\documentclass{scrreprt}

\usepackage{pgfplots}
\pgfplotsset{compat=1.8}

\begin{document}

\begin{tikzpicture}
\pgfkeyssetvalue{/mykeys/bardistance}{2pt}% Abstand zwischen den Balken beim gleichen x-Wert
\pgfplotsset{every axis/.style={ybar, scale only axis, xmin=0, xmax=8, ymin=0}}
%Linke Achse (Primärachse)
\begin{axis}[axis y line*=left, ymax=10]
\addplot+[bar shift=-\pgfplotbarwidth-\pgfkeysvalueof{/mykeys/bardistance}] coordinates {(1,3)(5,1)}; %Zug
\addplot+[bar shift=0] coordinates {(1,5)(6,2)}; %Biege
\end{axis}
%
%Rechte Achse (Sekundärachse)
\begin{axis}[axis y line*=right, axis x line=none, ymax=150]
\pgfplotsset{cycle list shift=2}
\addplot+[bar shift=\pgfplotbarwidth+\pgfkeysvalueof{/mykeys/bardistance}] coordinates {(1,100)(7,120)}; %Druck
\end{axis}
\end{tikzpicture}

\end{document}

Vielleicht gibt es aber noch bessere Lösungen dafür.

Gruß
Elke