Seite 1 von 1

Logarithmisches Balkendiagramm mit pgfplot

Verfasst: Mo 8. Aug 2011, 10:04
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

bug in pgfplots

Verfasst: Mi 10. Aug 2011, 20:12
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

Verfasst: Mi 10. Aug 2011, 21:54
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

Verfasst: Do 11. Aug 2011, 19:40
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

Verfasst: Do 11. Aug 2011, 21:23
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

Verfasst: Sa 13. Aug 2011, 16:14
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

Verfasst: Sa 13. Aug 2011, 17:19
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