Logarithmisches Balkendiagramm mit pgfplot

Tabellen und Grafiken erstellen und anordnen


cassio

Logarithmisches Balkendiagramm mit pgfplot

Beitrag von cassio »

Hallo Zusammen,

ich versuche gerade ein mit pgfplot erstelltes Balkendiagramm auf der Y-Achse logarithmisch darzustellen.

Allerdings verändert sich mein Y-Wert (der angezeigt wird) beim Umstellen von "axis" auf "semilogyaxis" derart, dass ich mir den Wert und die Grafik nicht mehr erklären kann.

Mein Minimalbeispiel ist hier:
\begin{semilogyaxis}[
ylabel=Sekunden,
legend style={at={(0.20,0.95)},anchor=north,legend columns=2},
major tick length=0cm,
nodes near coords=\rotatebox{90}{\pgfmathprintnumber\pgfplotspointmeta},
symbolic x coords={a,b,c,d,e},
xtick=data,
enlargelimits=0.2,
enlarge y limits={upper,value=0.4},
ybar=3pt,
font=\footnotesize,
width=12cm, 
height=7.5cm,
bar width=10pt,
]

\addplot
coordinates {(a,0.158) (b,0.387) (c,0.580) (d,8.587) (e,177.236) };

\addplot
coordinates {(a,0.01) (b,0.02) (c,0.14) (d,1.22) (e,17.71) };

\legend{Test 1,Test 2}
\end{semilogyaxis}
Wie gesagt, tauscht man "semilogyaxis" durch "axis" aus ist alles gut, allerdings sieht das Bild schlecht aus :-(

Hat vielleicht jemand Erfahrung damit?

Besten Dank
Cassio

feuersaenger

bug in pgfplots

Beitrag von feuersaenger »

Hi cassio,

das liegt an einem bug in pgfplots, der die "0" niveaulinie fuer log plots falsch setzt.

Ich habe das gerade behoben - wenn Du darauf angewiesen bist, muesstest Du die demnaechst wieder unter http://pgfplots.sourceforge.net/ erscheinende "unstable" verwenden.

Mit liebem Gruss

Christian

cassio

Beitrag von cassio »

Wow, danke. Das ist aber ein prompter Serivce :D

Gibt es einen Termin für die Unstable-Version? Ich benötige die Grafik am WE zwecks Präsentation.

Oder kann ich den Bug selbst beheben?

Danke
Cassio

Feuersaenger

Beitrag von Feuersaenger »

Hi cassio,

unter dem angegeben link findest Du schon den bugfix, ja. Kannst es ja mal ausprobieren - sollte gehen. Allerdings musst Du dafuer

\pgfplotsset{compat=1.5}

in der praeambel setzen (aus rueckwaertskompatibilietaetsgruenden hatte ich das nicht sofort aktiviert).

Mit liebem Gruss

Christian

cassio

Beitrag von cassio »

Abend Christian,

ich habe die unstable-Version runter geladen und in mein lokales tex-Verzeichnis kopiert (überspielt).

Allerdings habe ich immer noch nicht das erwartete Ergebnis. Beispiel: beim ersten Wert des zweiten Plots bekomme ich statt des erwarteten Y-Wertes 0.01 den Wert -4.61 angezeigt. Das sagt mir leider nichts, möglicherweise verstehe ich auch die Anzeige nicht.

Ein Blick in die Log-Dateien bringt folgende Pakte-Version: "Package: pgfplots 2011/07/29 v1.5 (git show 1.5-6-g1e97e47 )"
Das sollte die unstable-Version sein.

Beste Grüße
cassio

Feuersaenger

Beitrag von Feuersaenger »

Hi cassio,

richtig, mein Vorschlag bezog sich nur auf die Kurven als solche...

Das \pgfplotspointmeta zeigt den /logarithmierten/ Wert an, daher die Verwirrung.

Ich sehe da zwei moegliche Abhilfen:

a) Berechne den Wert in Tex mit \pgfmathparse. Das sollte mit erweiterter Genauigkeit passieren, daher das \pgfkeys{/pgf/fpu}:

nodes near coords=\rotatebox{90}{{\pgfkeys{/pgf/fpu}\pgfmathparse{exp(\pgfplotspointmeta)}\pgfmathprintnumber[sci]\pgfmathresult}},

Das [sci] nach dem number printer schalted auf die Wissenschaftliche Darstellung (wie Du magst).

b) Teile pgfplots mit, dass es den originalen, nicht angefassen ("rohen") Wert darstellen soll. Vorteil: keine Rundungsfehler. Nachteil: man muss eine technische Zusatzangabe machen:

nodes near coords=\rotatebox{90}{\pgfmathprintnumber[sci]\value},
visualization depends on=rawy \as \value,

Das rawy ist eine Funktion, die von \pgfmathparse innerhalb von pgfplots verstanden wird. Die liefert immer den "rohen" numerischen Wert (in diesem Fall fuer y).

Ich fuerchte, die ist gar nicht ordentlich dokumentiert - das muss sich aendern.

Hilft das?


Mit liebem Gruss

Christian

cassio

Beitrag von cassio »

Oh ja, das hilft mir sehr viel weiter.

Ich bin dir sehr dankbar für deine Hilfe.

Jetzt ist das Wochenende gerettet.

Beste Grüße
cassio

Antworten