PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : pgfplots - nodes near coords



HumanDelight
29-03-2015, 17:17
Hallo an euch,

im Rahmen meiner Masterarbeit würde ich gerne den Diagrammtyp x- oder ybar stacked verwenden, um den einen oder anderen Sachverhalt zu verdeutlichen. Leider bin ich mit der Darstellung der "nodes near coords" Option nicht zufrieden. Ich hab folgendes Minimalbeispiel aus der pgfplots Doku erweitert, um die Probleme deutlich zu machen.



%Header
\documentclass[]{standalone}

%Sprachpakete
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage[ngerman]{babel}

%\usetikzlibrary{decorations.pathmorphing}
\usepackage{pgfplots}
\pgfplotsset{compat=newest}
\usepackage{graphicx} %Kompatibiltätsmodus für die jeweilige Version

\begin{document}


\begin{tikzpicture}
\begin{axis}[
ybar stacked,% configures `bar shift
x tick label style={/pgf/number format/1000 sep=},
ylabel=Population,
enlargelimits=0.15,
legend style={at={(0.5,-0.15)},
anchor=north,
legend columns=-1},
bar width=9pt,
nodes near coords,
%nodes near coords align={vertical},
point meta=y *10^-7 % the displayed number
]
\addplot coordinates {(1930,50e6) (1940,33e6) (1950,40e6) (1960,50e6) (1970,70e6)};
\addplot coordinates {(1930,02e6) (1940,42e6) (1950,43e6) (1960,45e6) (1970,65e6)};
\legend{Far,Near}
\end{axis}
\end{tikzpicture}
\end{document}


1. Ich hätte gerne, dass ich den Wert einer jeden Teilsäule bei z. B. 1930 gezeigt bekomme und nicht das Ergebnis der roten Säule kumuliert ausgegeben wird, d. h. ich hätte gerne, dass die rote Säule mit 02e6 beschriftet wird. Weiß einer von euch, ob es dafür einen Schalter o. Ä. gibt, um das Ergebnis nach meinen Vorstellungen hinzubekommen? -->> Lösung Gefunden: meta point = rawy!! wie folgt einfügen:

\addplot[meta point=rawy] coordinates {(1930,50e6) (1940,33e6) (1950,40e6) (1960,50e6) (1970,70e6)};

Dies hat jedoch den Nachteil, dass man dann die Farben der Säulen selbst definieren muss, oder kennt jemand von euch eine Möglichkeit, wie dies umgangen werden kann?

2. in der pgfplots-Doku werden die Balken und Säulen mittig beschriftet und nicht, wie hier, an der oberen Kante der jeweiligen Säule. Wisst ihr, wie ich das einstellen kann?

3. und auch meine letzte Frage an euch. Gerade, wenn, wie z. B. bei 1930 zu sehen, die rote Säule sehr "dünn ist", stehen die Werte beider Säulen z. T. übereinander. Wisst ihr, wie ich das verhinden kann?

Ich hoffe, es gibt jemanden, der das Problem bereits hatte und mir mit einer Lösung aushelfen kann. Danke euch und einen schönen Sonntag noch.

esdd
29-03-2015, 20:56
1. Du könntest \addplot+[point meta=rawy] coordinates {(1930,50e6) (1940,33e6) (1950,40e6) (1960,50e6) (1970,70e6)}; verwenden oder bei den axis Optionen point meta=rawy angeben oder dort die Angabe der Option point meta einfach weglassen.

2. Hört sich danach an, als ob bei Dir noch die Version 1.8 genutzt wird. Aktuell ist aber derzeit 1.12.

3. Siehe 2.

Im folgenden Beispiel lasse ich mir die genutzte Version mit anzeigen:


\documentclass[margin=5pt]{standalone}
\usepackage{pgfplots}
\pgfplotsset{compat=newest}

\begin{document}
\begin{tikzpicture}
\begin{axis}[
ybar stacked,% configures `bar shift
x tick label style={/pgf/number format/1000 sep=},
ylabel=Population,
enlarge x limits=0.15,
enlarge y limits={.15,upper},
ymin=0,
legend style={at={(0.5,-0.15)},
anchor=north,
legend columns=-1},
bar width=9pt,
nodes near coords,
]
\addplot coordinates {(1930,50e6) (1940,33e6) (1950,40e6) (1960,50e6) (1970,70e6)};
\addplot coordinates {(1930,02e6) (1940,42e6) (1950,43e6) (1960,45e6) (1970,65e6)};
\legend{Far,Near}
\end{axis}
% genutzte Version anzeigen
\node[anchor=south east,orange]at(current axis.outer north east){pgfplots Version \pgfplotsversion};
\end{tikzpicture}
\end{document}

Gruß
Elke

HumanDelight
30-03-2015, 13:20
Hallo Elke,

danke dir für den Support. Ich werde das mit der Versionsanzeige erst einmal unbedingt ausprobieren und berichten. Es sollte eigentlich eingestellt sein, dass die Updates von Paketen "on-the-fly" installiert werden.

Zum Thema "Daten in zu kleinen Abschnitten der Säule ausblenden":
Ist das bei V1.12 automatisch hinterlegt oder muss ich Modifikation wie z. B. hier (http://tex.stackexchange.com/questions/196022/how-to-remove-small-value-labels-from-ybar-chart) vornehmen?

Bis später
Markus

esdd
30-03-2015, 15:03
Zum Thema "Daten in zu kleinen Abschnitten der Säule ausblenden":
Ist das bei V1.12 automatisch hinterlegt oder muss ich Modifikation wie z. B. hier (http://tex.stackexchange.com/questions/196022/how-to-remove-small-value-labels-from-ybar-chart) vornehmen?

Das musst Du selbst vornehmen, aber Du hast ja schon einen Lösungsvorschlag gefunden.

Gruß
Elke

HumanDelight
31-03-2015, 15:21
Hallo,

hier ist also die Antwort auf die Frage, wie ich zu kleine Säulen ausblenden kann.



\documentclass[margin=5pt]{standalone}
\usepackage{pgfplots}
\pgfplotsset{compat=newest}
%\pgfplotsset{/pgf/number format/use comma} %Schalter: ein/aus

\begin{document}
\begin{tikzpicture}
\begin{axis}[
ybar stacked,% configures `bar shift
x tick label style={/pgf/number format/1000 sep=},
%ylabel=Population,
enlarge x limits=0.15,
enlarge y limits={.15,upper},
ymin=0,
%legend style={at={(0.5,-0.15)},anchor=north,legend columns=-1},
bar width=9pt,
nodes near coords={%
\pgfmathprintnumberto[fixed,assume math mode=true]{\pgfplotspointmeta}{\myval}%
\pgfmathparse{\myval<5?:\myval}\pgfmathresult%
},
%nodes near coords align=left
]
\addplot coordinates {(1930,50) (1940,33) (1950,40) (1960,50) (1970,70)};
\addplot coordinates {(1930,02) (1940,42) (1950,43) (1960,45) (1970,65)};
\addplot coordinates {(1930,15) (1940,15) (1950,15) (1960,15) (1970,15)};
%\legend{Far,Near,Zero}
\end{axis}
% genutzte Version anzeigen
\node[anchor=south east,orange]at(current axis.outer north east){pgfplots Version \pgfplotsversion};
\end{tikzpicture}
\end{document}


Der relevanten Wert, für alle die, die das Problem in Zukunft haben sollte, ist "myval". Hier die Balkenhöhe bitte selbst nach eigenem Ermessen definieren.

Danke!

PS:

So ganz gelöst hat sich das Problem doch noch nicht :)! Wenn ich das Diagramm in meine Arbeit einbauen will, möchte ich auch, dass "Werte", die ein "," enthalten in der deutschen Darstellung dargestellt werden. Dazu wird im Header der Zusatz

\pgfplotsset{/pgf/number format/use comma}

gemacht. Dann kann ich das obige Minimalbeispiel leider nicht mehr kompilieren. Kann mir diesbezüglich bitte noch einmal jemand aus der Patsche helfen, da meine gefundenen Lösungen (wie z. B. every node near coord/.append style={anchor=-40, /pgf/number format/.cd, use comma}) nicht funktionieren :(?

esdd
31-03-2015, 22:23
Dein Code läuft mit oder ohne use comma fehlerfrei durch, zeigt das Problem also nicht. Ich habe deshalb jetzt einfach mal aus der 40 eine 40.2 gemacht.

Ändere nodes near coords wie im folgenden Beispiel:


\documentclass[margin=5pt]{standalone}
\usepackage{pgfplots}
\pgfplotsset{compat=1.12}
\pgfplotsset{/pgf/number format/use comma}

\begin{document}
\begin{tikzpicture}
\begin{axis}[
ybar stacked,% configures `bar shift
x tick label style={/pgf/number format/1000 sep=},
%ylabel=Population,
enlarge x limits=0.15,
enlarge y limits={.15,upper},
ymin=0,
%legend style={at={(0.5,-0.15)},anchor=north,legend columns=-1},
bar width=9pt,
nodes near coords={%
\pgfmathprintnumberto[fixed,assume math mode=true,use period]{\pgfplotspointmeta}{\myval}%
\pgfmathparse{\myval<5?:"\noexpand\pgfmathprintnumber[use comma]{\myval}"}\pgfmathresult%
},
]
\addplot coordinates {(1930,50) (1940,33) (1950,40.2) (1960,50) (1970,70)};
\addplot coordinates {(1930,02) (1940,42) (1950,43) (1960,45) (1970,65)};
\addplot coordinates {(1930,15) (1940,15) (1950,15) (1960,15) (1970,15)};
%\legend{Far,Near,Zero}
\end{axis}
% genutzte Version anzeigen
\node[anchor=south east,orange]at(current axis.outer north east){pgfplots Version \pgfplotsversion};
\end{tikzpicture}
\end{document}

Gruß
Elke

HumanDelight
01-04-2015, 08:42
Hallo Elke,

vielen Dank dir für die wieder schnelle Antwort. Es tut. Vielen, vielen Dank ;). Beim Kopieren in die Masterarbeit ist jedoch ein weiteres Problemchen aufgetaucht.

Ich definiere dort logischerweise zusätzlich


%Sprachpakete
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage[ngerman]{babel}


Dann kommen wieder zig Fehlermeldungen, dass "}" vergessen wurden. Kommentiere ich babel aus, compiliert es wieder fehlerfrei durch. Liegt das an der pgfplots Version? Im Büro, wo ich zeitweilig auch an meiner Arbeit schreibe, ist noch pgfplots V1.9 installiert und der Update Manager muss erst über den IT-Support nachinstalliert werden.


Guten Start in den Tag und ich hoffe, dass es danach nichts mehr gibt.
Markus

esdd
01-04-2015, 12:13
Ich kann Dein Problem bei mir nachvollziehen. Vielleicht reicht es schon, wenn Du nach dem Laden von pgfplots


\usetikzlibrary{babel}

einfügst?

Gruß
Elke

HumanDelight
01-04-2015, 14:55
Hallo,

tikzlirbraby - nein, dass funktioniert leider (noch) nicht. Fehlermeldung dabei ist:

I can't find tikzlibrarybabel.code.tex

Ich werde mal zu Hause schauen, ob bei den aktuellsten Paketen (pgfplots 1.12 und babel 3.9l) das Diagramm problemlos compiliert wird (wie bei dir). Und dann werde ich die Lösung hoffentlich posten können. Das Problem light in der Umdefinition, die durch dich im Verlauf des Threads vorgenommen wurde, um mein ursprüngliches Problem zu lösen:

"\noexpand\pgfmathprintnumber[use comma]{\myval}"}

Lösche ich diesen Part aus der "node near coords"-Definition, kann ich das Diagramm problemlos mit [ngerman]{babel} compilieren. Ich hoffe, dass es mit der aktuellsten pgfplots-Version durchläuft.

Danke dir noch einmal.
Markus

esdd
01-04-2015, 17:04
Dann ist die pgf/tikz Version auch nicht aktuell. Die babel Bibliothek ist erst seit der Version 3.0 dabei, die aber auch schon deutlich über ein Jahr alt ist.

Alternativ kannst Du zwischen \begin{tikzpicture} und \begin{axis}


\shorthandoff{"}

setzen.

Gruß
Elke

HumanDelight
01-04-2015, 22:33
Hi,

also bei mir zu Hause mit allen Versionen up to date läuft es mit \usetikzlibrary{babel} durch. Ich werde mal im Büro den IT-Support kontaktieren und mir den Update-Manager nachinstallieren lassen.

Vielen, vielen Dank dir für den super guten Support.