PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Beschriftung eines Histogramms mit pgfplots



joh
30-10-2014, 17:29
Hallo,

ich bin gerade mit Datenauswertungen und damit mit illustrieren beschäftigt.
Momentan möchte ich eine Reihe (mindestens zwei) Histogramme plotten, die sich aber, aufgrund der Datenlage, nicht allzu sehr voneinader unterscheiden. Deswegen dachte ich, schreibe ich die Werte einfach zu den Balken dazu.
Hierbei tritt nun, abgesehen von Formatierungsschwächen, das Problem auf, dass der erste Wert wohl richtig angezeigt wird und die nachfolgenden Balken einfach mit diesem Wert beschriftet werden.

Mein Minimalbeispiel sieht wie folgt aus:


\documentclass{minimal}

\usepackage{pgfplots}
\pgfplotsset{compat=newest}
\usepgfplotslibrary{statistics}


\begin{document}

\begin{tikzpicture}
\centering
\begin{axis}[ybar, nodes near coords, nodes near coords align={vertical}]
\addplot+[hist={bins=20}] table [ y index=0 ] {file.dat};
\end{axis}
\end{tikzpicture}

\end{document}


Das Datenfile hat zum Beispiel folgende Werte:


3.318279732672774
3.313536481867927
3.308780250910576
3.30401108683684
3.299229036810693
3.195914192782224
3.190860837200872
3.185795714651285
3.180718875224284
3.175630369126574
3.170530246680276
1.803106526683108
1.796845745438865
1.79058698315058
1.628770104432824
1.622589170415303
1.493747799438113
1.487663243878621
0.002859026434598179
0.003205152600838371

Danke schonmal für eure Hilfe!

Gruß Jo

FelixT
31-10-2014, 21:31
Hi joh,

pgfplots (http://texwelt.de/wissen/themen/pgfplots/) ist ein vielbesprochenes Thema auf TeXwelt.de (http://texwelt.de/wissen/), Du kannst es ggf. auch mal da versuchen. Am besten mit Querverweis / Link, dann sagt man auch nix gegen crossposts. :)

Felix

joh
03-11-2014, 09:27
Bevor ich auf ein anderes Forum weiterziehe, versuch ichs nochmal hier, mit ein paar neuen Erkenntnissen. ;)

Es ist offensichtlich kein Problem, wenn ich die Daten direkt mit


\addplot coordinates { .. };

einbinden, wie zum Beispiel hier zu finden: http://tex.stackexchange.com/questions/27137/problem-plotting-histogram-using-pgfplots-package.
Funktioniert bei mir einwandfrei, bis auf die im Link angesprochenen Formatprobleme, aber um die geht es mir ja nicht.
Allerdings ist das auch kein wirkliches Histogramm.

Werden die Daten ebenfalls im Plotbefehl selber eingebunden, und das Ganze als Histogramm geplottet, wie hier http://tex.stackexchange.com/questions/181061/pgfplots-clipping-everything-outside-a-specific-area, dann bekomme ich nur durch den Befehl


nodes near coords

keine Zahlen geplottet.

Deswegen dachte ich muss es was mit der dort benutzten Spezifikation zu tun haben:


nodes near coords={\pgfmathprintnumber{\pgfkeysvalueof{/data point/y}}},

Benutze ich die, bekomme ich allerdings folgende Fehlermeldungen:


! Missing \endcsname inserted. <to be read again> \pgfk@/data point/y
! Extra \endcsname. \pgfflt@impl ... \ifx \csname pgfflt@#1\endcsname \relax \pgfmathfloat@a@S =...
! Extra \endcsname. \pgfflt@init ...\ifx \csname pgffltA@#1\endcsname \relax \expandafter \pgffl...
! Package PGF Math Error: Could not parse input '\pgfk@/data point/y ' as a floating point number, sorry. The unreadable part was near '\pgfk@/data point/y '.


Das zugehörige Minimalbeispiel wäre


\documentclass{minimal}

\usepackage{pgfplots,tikz}
\pgfplotsset{compat=newest}
\usetikzlibrary{pgfplots.statistics}


\begin{document}

\begin{tikzpicture}
\centering
\begin{axis}[
ybar,
nodes near coords={\pgfmathprintnumber{\pgfkeysvalueof{/data point/y}}},
nodes near coords align={vertical}
]
\addplot+[hist={bins=20}] table [ y index=0 ] {file.dat};
\end{axis}
\end{tikzpicture}

\end{document}

immer noch mit der Beispieldatei wie aus dem ersten Post.

Meine pgfplots Kenntnisse halten sich in Grenzen, weswegen ich mit den Fehlermeldungen noch nicht so richtig zurecht komme. Aber vielleicht sagen die ja jemandem von euch was.

FelixT
03-11-2014, 16:24
Bei mir läuft das Minimalbeispiel fehlerfrei durch, mit TeX Live 2014.


Bevor ich auf ein anderes Forum weiterziehe, versuch ichs nochmal hier, mit ein paar neuen Erkenntnissen. ;)

Na klar, war nur ein Tipp. Ich finde halt die Beiträge dort beeindruckend (klick mal: pgfplots Beispiele (http://images.google.com/search?tbm=isch&q=pgfplots+site:texwelt.de)) und vielleicht hat dort einer die zündende Idee. Außerdem ist dort alles einsortiert nach Thema (pgfplots (http://texwelt.de/wissen/themen/pgfplots/?Sortieren=Populärste)) und Wertung, man findet also Lösungen gut wieder.

Ich habe wie gesagt probiert, alle Balken werden beschriftet (viele mit 0), keine Fehler jedenfalls. Übrigens ist die Minimalklass für Minimalbeispiele trotz des Namens nicht geeignet, da geht nicht mal sowas grundlegendes wie \large für Schriftgröße ändern, Tabellen werden nicht richtig dargestellt u.a. Ich würde einfach article nehmen, die hat sowieso auch jeder installiert und die hat gewissen quasi-Standardbefehle und Parameter eben drin.

Felix

joh
07-11-2014, 10:33
Stimmt, die haben dort ziemlich viel davon. Auf jeden Fall gut zu wissen.

Also, ich hab das alles mal daheim mit MacTeX-2014 versucht und es ist durchgelaufen. Wir haben hier in der Uni noch TeX Live 2013 drauf. Scheint dann wohl daran zu liegen. Muss ich dem SysAdmin mal Bescheid geben.

Um das Thema dann noch etwas hinreichender abzuschließen und eine Idee an Leute mit der selben Frage/Aufgabenstellung zu geben:
Ich hab meine Daten jetzt mit Python vorbereitet. Ich will eine Reihe an Histogrammen plotten, die eine Verteilung eines Datensatzes darstellen der sich mit der Zeit verändert. Um die gleiche Anzahl an Bins und auch die gleichen Bereiche zu erhalten, iteriere ich in Python über die Datensätze hol mir das Minimum/Maximum von allen und teile das Intervall [Minimum,Maximum] durch die Anzahl an Bins die ich haben will und erstelle dann damit innerhalb von Python ein Histogramm. Anschließend schreibe ich die Daten dann wieder einzeln in Files wobei in der ersten Spalte die Stützpunkte der Bins stehen und in der zweiten Spalte stehen die Histogrammwerte.
Mit LaTeX kann ich dann die einzelnen Files einbinden und erhalte dann ein wie ich finde schönes Diagramm indem der Verlauf der Histogramme gut dargestellt wird, weil alles in einem Bild ist. Damit muss man dann auch die Werte nicht unbedingt plotten, was vielleicht etwas unübersichtlich wird.

LaTeX Quellcode:


\begin{figure}[tp]
\centering
\ref{legend:name}~\\
\begin{tikzpicture}
\begin{axis}[ybar interval,
ymin=0,
xticklabel interval boundaries,
x tick label style={rotate=-45,
anchor=west,
xshift=-1mm,
yshift=-1mm,
},
legend style={draw=none,
font=\scriptsize},
legend columns=-1,
legend entries={file1, file2, file3},
legend to name=legend:name,
]
\addplot+ [fill] table
{file1.dat};
\addplot+ [fill] table
{file2.dat};
\addplot+ [fill] table
{file3.dat};
\end{axis}
\end{tikzpicture}
\end{figure}