Seite 1 von 1

pgfplots: Probleme mit Daten als Text

Verfasst: Sa 10. Okt 2015, 20:07
von mofehl
Moin,

folgendes Problem beschäftigt mich im Moment. Ich habe eine Tabelle, die ich als Balkendiagramm darstellen möchte. Die Tabelle enthält für die Ordinate nur Text, für die Abzisse Zahlen und Text.

Hier erstmal das MWE:
\documentclass[11pt,margin=10pt]{standalone}
\usepackage{tikz,pgfplots,pgfplotstable,filecontents}

\begin{filecontents*}{table.dat}
FD;Huette
0.464934622;Vernagth\"utte
0.245014422;Neue Traunsteiner H\"utte
0.498548701;Karlsbader H\"utte
0.224030091;Straubinger Haus
0.011425672;Weidener H\"utte
n.v.;Rappenseeh\"utte
0.313373342;Kemptner H\"utte
0.094089076;Weilheimer H\"utte
0.026307408;Duisburger H\"utte
\end{filecontents*}

\pgfplotstableread[col sep=semicolon]{table.dat}{\mytable}

\begin{document}
\begin{tikzpicture}
\begin{axis}[
	compat=1.11,
	xbar,
	scaled ticks=false,
	/pgf/number format/fixed,
	/pgf/number format/precision=3,
	nodes near coords,
	xmin=0.0,
	xmax=1.0,
	xtick={0.0,0.2,...,1.0},
	%yticklabels from table={table.dat}{Huette},
	ytick=data,
	symbolic y coords={Vernagth\"utte,Neue Traunsteiner H\"utte,Karlsbader H\"utte,Straubinger Haus,Weidener H\"utte,Rappenseeh\"utte,Kemptner H\"utte,Weilheimer H\"utte,Duisburger H\"utte},
]

\addplot table [x=FD,y=Huette] {\mytable};

\end{axis}
\end{tikzpicture}
\end{document}
Gleich drei Dinge möchte ich ändern:

(1) Anstelle die yticks händisch über symbolic y coords einzugeben, wäre mir lieber, ich könnte sagen: Nimm einfach die Spalte "Huette" und nimm das als yticks. Im Internet und in der Anleitung bin ich auf yticklabels from table gestoßen. (Im Code auskommentiert.) Das funktioniert leider nicht bei mir.

(2) In der Tabelle sind alle x-Werte zahlen bis auf eine, die "n.v." heißt. Diese möchte ich auch so dargestellt haben.

(3) Die Reihenfolge der y-Werte soll genau andersherum sein, also Vernagthütte ganz oben, Duisburger Hütte ganz unten.

Von den drei Punkten ist der erste am wichtigsten. Wer kann mir helfen?

Bild

Verfasst: So 11. Okt 2015, 01:54
von esdd
Da ich für den zweiten Punkt keinen Vorschlag habe, habe ich für die anderen beiden Punkte die betreffende Zeile aus den Daten entfernt.

Zu Punkt (1): Zum einen muss pgfplots wissen, dass die bei yticklabels from table angegebene Datentei das Semikolon als Spaltentrenner verwendet. Du müsstest die Option table/col sep=semicolon also nicht nur beim Lesen mit \pgfplotstableread setzen, sondern entweder noch global mit \pgfplotsset oder lokal im optionalen Argument der axis-Umgebung. Alternativ kannst Du auch einfach die schon eingelesene Datei verwenden:
yticklabels from table={\mytable}{Huette},
Außerdem musst Du beim Plotten für y den \coordindex verwenden:
\addplot table [x=FD,y expr=\coordindex] {\mytable};
Zum Punkt (3): Die Reihenfolge lässt sich mit
y dir=reverse
umkehren.

Code (ohne die eine Hütte):

\documentclass[11pt,margin=10pt]{standalone} 
\usepackage{pgfplots,pgfplotstable,filecontents} 

\begin{filecontents*}{table.dat} 
 FD;Huette 
 0.464934622;Vernagth\"utte 
 0.245014422;Neue Traunsteiner H\"utte 
 0.498548701;Karlsbader H\"utte 
 0.224030091;Straubinger Haus 
 0.011425672;Weidener H\"utte 
 0.313373342;Kemptner H\"utte 
 0.094089076;Weilheimer H\"utte 
 0.026307408;Duisburger H\"utte 
\end{filecontents*} 

\pgfplotsset{compat=1.12}%,table/col sep=semicolon}

\pgfplotstableread[col sep=semicolon]{table.dat}{\mytable} 

\begin{document} 
\begin{tikzpicture} 
\begin{axis}[ 
    xbar, 
    scaled ticks=false, 
    /pgf/number format/fixed, 
    /pgf/number format/precision=3, 
    nodes near coords, 
    xmin=0.0, 
    xmax=1.0, 
    xtick={0.0,0.2,...,1.0}, 
    yticklabels from table={\mytable}{Huette}, 
    ytick=data,
    y dir=reverse
] 

\addplot table [x=FD,y expr=\coordindex] {\mytable}; 

\end{axis} 
\end{tikzpicture} 
\end{document}

Verfasst: So 11. Okt 2015, 11:51
von mofehl
Hallo Elke,

tausend Dank für Deine Hilfe! (Wieder einmal!) Auch wenn Punkt (2) offen bleibt, habe ich den Status auf "beantwortet" gesetzt. Vielleicht stelle ich Punkt (2) als eigene Frage in einem neuen Thread. LG