PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : pgfplots: Text als Beschriftung der x-Achse möglich?



Dr.Wackelzahn
27-11-2008, 08:38
Hallo,
ich hatte selbiges Problem bereits in einem englisch sprachigen Forum gestellt aber keine Lösung gefunden.
Daher versuche ich mein Glück hier.
Ich benötige ein Balkendiagramm mit einer Text- (nicht Zahlen) -Beschriftung in der X-Achse.
Im Anhang habe ich ein Beispiel dazu in gimp erstellt.
Mit pgfplots habe ich es nicht geschafft. Zwar gibt es die Möglichkeit bei Jahreszahlen "von","bis" anzugeben. Aber ich benötige reinen Text, wie im Beispiel gezeigt.
Ist das mit pgfplots möglich?
Gibt es eine andere Lösung?

Vielen Dank,
mfG,
Alex

Lilliane
27-11-2008, 09:17
Hallo Dr.Wackelzahn,

ich würd es mal mit tikZ versuchen. Beispiele findest Du bei texample.net (http://www.texample.net/tikz/examples/feature/coordinate-systems/), eine Übersicht bei der Tex-Usergruppe Dresden (http://www.tn-home.de/TUGDD/Stuff/TikZ_final.pdf) und Einführung in Grafiken mit tikZ (http://www.unix-ag.uni-kl.de/_media/latexkurs2007-grafik1.pdf?id=latex-kurs-themen&cache=cache).

Viele Grüße

Lilly

voss
27-11-2008, 09:25
Hallo,
ich hatte selbiges Problem bereits in einem englisch sprachigen Forum gestellt aber keine Lösung gefunden.
Daher versuche ich mein Glück hier.
Ich benötige ein Balkendiagramm mit einer Text- (nicht Zahlen) -Beschriftung in der X-Achse.
Im Anhang habe ich ein Beispiel dazu in gimp erstellt.
Mit pgfplots habe ich es nicht geschafft. Zwar gibt es die Möglichkeit bei Jahreszahlen "von","bis" anzugeben. Aber ich benötige reinen Text, wie im Beispiel gezeigt.
Ist das mit pgfplots möglich?
Gibt es eine andere Lösung?


http://tug.org/PSTricks/main.cgi?file=pst-plot/psaxes#ChemElements

Herbert

mechanicus
27-11-2008, 09:26
Ist das mit pgfplots möglich?
Gibt es eine andere Lösung?
Hallo,

ich kenn mich mit pgfplots nicht aus. Vielleicht geht es da auch so, wie ich es hier mit PsTricks dargestellt habe.

\documentclass{article}
\usepackage[showframe]{geometry}
\usepackage{pstricks,pstricks-add,multido}

\newcounter{zahl}


\begin{document}
\psset{xunit=0.7cm,yunit=1cm,tickstyle=bottom}
\begin{pspicture}(-1,-1)(18,10)
\psaxes[linewidth=1.5pt,labels=y,dy=1,Dy=20,ticks=y,subtic ks=3](17.5,9.1)
\psaxes[linewidth=1.5pt,labels=none,dx=1,ticks=x,subticks= 0](17.5,0)
\multido{\iA=1+1}{17}{\uput{0.3}[-90](\iA,0){\setcounter{zahl}{\iA}\Alph{zahl}}}
\end{pspicture}
\end{document}

Gruß
Marco

Dr.Wackelzahn
27-11-2008, 09:58
http://tug.org/PSTricks/Examples/Charts/pstc-doc.pdf
Scheint die Lösung zu haben.
Vielen Dank für die schnelle Hilfe!
Werde mich dann am Wochenende daran austoben...

Gruß,
Alex

voss
27-11-2008, 11:02
http://tug.org/PSTricks/Examples/Charts/pstc-doc.pdf
Scheint die Lösung zu haben.
Vielen Dank für die schnelle Hilfe!
Werde mich dann am Wochenende daran austoben...


das geht mittlerweile einfacher ...
zeige deinen Datensatz mit echten Werten und dann kan man sofort
helfen.

Herbert

Dr.Wackelzahn
27-11-2008, 16:56
Also es sind mehrere, unterschiedliche Balkendiagramme die ich benötige. Excel oder ähnliches kommt für mich nicht in Frage. Daher habe ich mein Graphen und das einzige Kuchendiagramm bereits in pgfplots umgesetzt.

Interessant wäre eine externe "Daten"-Datei, selbstdefinierbare Größe des Diagramms, Festlegung von ymin / ymax und xmin / xmax.

Ich fange mal mit dem einfachsten Diagramm an:

Titel: "Anzahl augmentiert Ja/nein"

Achsenbeschriftung:
y-Achse (um 90Grad gedreht/vertikal): "Anzahl"
x-Achse: augmentiert?

1. Balken: Ja = 300
2. Balken: Nein = 15

Ungefähr so wie im Beispiel angegeben

voss
27-11-2008, 17:42
Also es sind mehrere, unterschiedliche Balkendiagramme die ich benötige. Excel oder ähnliches kommt für mich nicht in Frage. Daher habe ich mein Graphen und das einzige Kuchendiagramm bereits in pgfplots umgesetzt.

Interessant wäre eine externe "Daten"-Datei, selbstdefinierbare Größe des Diagramms, Festlegung von ymin / ymax und xmin / xmax.

Ich fange mal mit dem einfachsten Diagramm an:

Titel: "Anzahl augmentiert Ja/nein"

Achsenbeschriftung:
y-Achse (um 90Grad gedreht/vertikal): "Anzahl"
x-Achse: augmentiert?

1. Balken: Ja = 300
2. Balken: Nein = 15

Ungefähr so wie im Beispiel angegeben

Bei zwei x-Werten lohnt es sich nicht, dafür eine spezielles Malkro zu benutzen.


\documentclass[12pt]{article}
\usepackage{pstricks-add}
\begin{document}

\def\data{1 385 3 135}
\psset{llx=-0.6cm,lly=-0.6cm,
yAxisLabel=Anzahl der Implikationen,yAxisLabelPos={-0.5,c},
xAxisLabel=Augmentiert,xAxisLabelPos={c,-30}}
\begin{psgraph}[Dy=50,dy=1.5cm,
yticksize=-10pt 0,subticks=5,ticks=y](0,0)(4,400){15cm}{12cm}
\psaxes[labels=none,ticks=y,yticksize=0 4,ysubticks=5,
subticksize=1,tickcolor=black!20,subtickcolor=blac k!30,
subticklinestyle=dashed,Dy=50,dy=1.5cm](4,400)
\listplot[plotstyle=LineToXAxis,linewidth=2cm,
linecolor=blue!40]{\data}
\uput*[90](1,385){385}\uput*[90](3,135){135}
\uput[-90](1,0){J}\uput[-90](3,0){N}
\end{psgraph}

\end{document}


Herbert

Dr.Wackelzahn
27-11-2008, 18:02
\documentclass[12pt]{article}
\usepackage{pstricks-add}
\begin{document}

Okay klar soweit


\def\data{1 385 3 135}

Hier werden die Daten festgelegt für den 1. und 3. Balken, oder?


\psset{llx=-0.6cm,lly=-0.6cm,

Was bedeutet lly / llx?


yAxisLabel=Anzahl der Implikationen,yAxisLabelPos={-0.5,c},
xAxisLabel=Augmentiert,xAxisLabelPos={c,-30}}

Klar, Achsenbeschriftung und dessen Position, woher kommt "c"?


\begin{psgraph}[Dy=50,dy=1cm,

Dy und dy habe ich noch nicht ganz verstanden, Dx und dx hatte ich auch schon gesehen, kappiers aber nicht.


yticksize=-10pt 0,subticks=5,ticks=y](0,0)(4,400){15cm}{12cm}

Hier werden die kleinen Strichlein gezeichnet und die Größe des Diagramms festgelegt, ja?


\psaxes[labels=none,ticks=y,yticksize=0 4,ysubticks=5,
subticksize=1,tickcolor=black!20,subtickcolor=blac k!30,
subticklinestyle=dashed,Dy=50,dy=1cm](4,400)

Hier sind die Hilfslinien, oder?


\listplot[plotstyle=LineToXAxis,linewidth=2cm,
linecolor=blue!40]{\data}
\uput*[90](1,385){385}\uput*[90](3,135){135}

Jetzt wird gezeichnet, aber die Werte werden von Hand angegeben, obwohl voher definiert?


\uput[-90](1,0){J}\uput[-90](3,0){N}

Die Wichtige Beschriftung für Balen 1 und 3


\end{psgraph}
\end{document}

Bis auf die kleinen Fragen hab ich soweit kappiert.
Wichtig wäre aber schon für mich generell eine externe Datei zu verwenden, da ich ja noch viele weitere Diagramme habe, das war mal das einfachste.

Ich möchte mich ganz herzlich bedanken für die Bemühungen!!
Ich hatte schon Wochenenden verbracht um das mit tikz zu verwirklichen und mit pgfplots scheint es nicht zu gehen.
Vielen Dank für die Hilfe!

voss
27-11-2008, 18:42
Hier werden die Daten festgelegt für den 1. und 3. Balken, oder?

Was bedeutet lly / llx?

untere linke Ecke verschieben


Klar, Achsenbeschriftung und dessen Position, woher kommt "c"?

center


Dy und dy habe ich noch nicht ganz verstanden, Dx und dx hatte ich auch schon gesehen, kappiers aber nicht.

in Schritten von 1.5cm um 50 erhöhen


Hier werden die kleinen Strichlein gezeichnet und die Größe des Diagramms festgelegt, ja?

Hier sind die Hilfslinien, oder?

Jetzt wird gezeichnet, aber die Werte werden von Hand angegeben, obwohl voher definiert?

das kann man automatisieren. Hängt aber sehr von der Form deines
Datensatzes ab. Bei wenigen Werten lohnt selten der Aufwand.


Die Wichtige Beschriftung für Balen 1 und 3


Bis auf die kleinen Fragen hab ich soweit kappiert.
Wichtig wäre aber schon für mich generell eine externe Datei zu verwenden, da ich ja noch viele weitere Diagramme habe, das war mal das einfachste.


Herbert

Dr.Wackelzahn
30-11-2008, 10:47
Aber der 1. Balken (385) liegt bei 580 auf der y Achse. Das ist doch zu viel!
Folgende Fragen bleiben noch:
- Wie kann ich die Datenangaben automatisieren?
- Wie kann ich die y/x Achse bei einem anderen Wert als 0 beginnen lassen?

Vielen Dank für die Hilfe!
Gruß,
Alex

voss
30-11-2008, 12:49
Aber der 1. Balken (385) liegt bei 580 auf der y Achse. Das ist doch zu viel!

war ein Tippfehler, ist oben im Beispiel korrigiert


Folgende Fragen bleiben noch:
- Wie kann ich die Datenangaben automatisieren?
- Wie kann ich die y/x Achse bei einem anderen Wert als 0 beginnen lassen?


Gib mal einen Datensatz an, der ein Automatisieren sinnvoll macht.

Achsenursprünge kann man mit Ox=.. und Oy=... festlegen

Herbert

Dr.Wackelzahn
30-11-2008, 13:26
Wie in der Datei angegeben erhalte ich die Daten in etwa so.
Dabei sind die Datensätze jeweils durch "Tab" getrennt. Das kann ich leider nicht ändern, könnte aber durch Find&Replace dies durch ein beliebiges Zeichen ändern.
Auch die Titelzeile und andere Angaben (Varianz,....) könnte ich von Hand wegschneiden.

voss
30-11-2008, 14:43
Wie in der Datei angegeben erhalte ich die Daten in etwa so.
Dabei sind die Datensätze jeweils durch "Tab" getrennt. Das kann ich leider nicht ändern, könnte aber durch Find&Replace dies durch ein beliebiges Zeichen ändern.
Auch die Titelzeile und andere Angaben (Varianz,....) könnte ich von Hand wegschneiden.

wenn es weiterhin nur so wenig Werte sind, dann einfach rauskopieren,
- komma durch Punkt ersetzen und _danach_
- tab durch , ersetzen.

Herbert


\documentclass[12pt]{article}
\usepackage{pstricks-add}
\begin{document}

\def\data{493, 424, 1743, 142, 165, 143, 351, 108, 186, 239, 241, 154, 141, 221,
856, 154, 261, 17, 108, 1743, 6088, 817.5, 2415.59, 49.14, 11.92, 2273.50, 47.68, 11.56}
\newcounter{xVal}
\psset{llx=-0.6cm,lly=-0.6cm,
yAxisLabel=Anzahl der Implikationen,yAxisLabelPos={-3.5,c},
xAxisLabel=Augmentiert,xAxisLabelPos={c,-500}}
\begin{psgraph}[Dy=500,dy=1cm,
yticksize=-10pt 0,subticks=5,ticks=y](0,0)(30,6000){15cm}{12cm}
\psaxes[labels=none,ticks=y,yticksize=0 30,ysubticks=5,
subticksize=1,tickcolor=black!20,subtickcolor=blac k!30,
subticklinestyle=dashed,Dy=500,dy=1cm](30,6000)
\psforeach{\nA}{\data}{%
\stepcounter{xVal}%
\psline[linewidth=0.45,linecolor=blue!60](\thexVal,0)(\thexVal,\nA)
\uput*[90]{90}(\thexVal,\nA){\small\nA}}
\end{psgraph}

\end{document}

Dr.Wackelzahn
30-11-2008, 14:54
Okay so weit so gut. Kann ich jetzt noch die x-Achse mit den Werten aus "example.txt" in der Zeile "Implantattyp" füllen, ohne jeden Wert von Hand mit den Koordinaten anzugeben?

Dr.Wackelzahn
30-11-2008, 16:53
Ich hatte da an soetwas wie folgendes gedacht:

\def\name{Test 1, Test 2, Test 3, Test 4, Test 5, Test 6, Test 7, Test 8, Test 9}
\def\data{500, 400, 450, 100, 50, 10, 154, 141, 221}
Um in \data die Werte anzugeben und in \name die jeweilige Beschriftung dazu.


\psforeach{\nA}{\data}{%
\stepcounter{xVal}%
\psline[linewidth=0.5,linecolor=blue!60](\thexVal,0)(\thexVal,\nA)
\uput*[90]{90}(\thexVal,\nA){\small\nA}}
Wie gehabt für das Zeichnen der Balken und die Angabe der genauen Werte über dem Balken.


\psforeach{\nB}{\name}{%
\stepcounter{yVal}%
\uput[90]{90}(\theyVal,\nB){\small\nB}}
Hätte ich gerne für die Beschriftung der Balken auf der x-Achse genommen, geht aber nicht.
Schade.

Dr.Wackelzahn
30-11-2008, 16:59
\psforeach{\nB}{\name}{%
\stepcounter{yVal}%
\uput[-90](\theyVal,0){\nB}}

Hat's gebracht!!

voss
30-11-2008, 17:07
Okay so weit so gut. Kann ich jetzt noch die x-Achse mit den Werten aus "example.txt" in der Zeile "Implantattyp" füllen, ohne jeden Wert von Hand mit den Koordinaten anzugeben?

kann man auch:


\documentclass[12pt]{article}
\usepackage{pstricks-add}
\usepackage{arrayjob}
\makeatletter
\def\pst@@@hlabel#1{\rput[rb]{45}{\checkxText(#1)\small\cachedata}}
\makeatother

\begin{document}

\newarray{\xText}
\readarray{xText}{Astra & Bego RI & Bego S & Cylindr & Screw & Line & Plus & Narrow & TE &
Voll & Wide & Wide Ne & Re Sel & Level & Plus & SLActi & SLAcPl & Anzahl & Minimum & Maximum &
Summe & Mittel & Varianz (n-1) & Standardabweichung (n-1) & Standardfehler (n-1) &
Varianz (n) & Standardabweichung (n) & Standardfehler (n)}
\psset{llx=-0.6cm, lly=-0.6cm,mathLabel=false,
yAxisLabel=Anzahl der Implikationen, yAxisLabelPos={-3.5,c},
xAxisLabel=Augmentiert, xAxisLabelPos={c,-1000}}
\begin{psgraph}[Dy=500, dy=1cm,
yticksize=-10pt 0,subticks=5,ticks=y](0,0)(30,6000){15cm}{12cm}
\psaxes[labels=none,ticks=y,yticksize=0 30,ysubticks=5,
subticksize=1,tickcolor=black!20,subtickcolor=blac k!30,
subticklinestyle=dashed,Dy=500,dy=1cm](30,6000)
\readdata{\dataA}{example2.dat}
\listplot[xyValues=false,plotstyle=bar,fillcolor=blue!40,fil lstyle=solid]{\dataA}
\end{psgraph}

\end{document}

Diese Version benutzt eine neue Funktion aus pstricks-add, du musst sie daher
updaten, oder das Zeichnen der Balken wie in dem letzten Beispiel.

http://perce.de/LaTeX/pstricks-add/pstricks-add.tex

Herbert

p.s.: man könnte das ganze auch komplett mit deinem Datensatz automatisieren,
aber das lohnt sich nur, wenn das relativ häufig auch bei anderen vorkommt.

voss
30-11-2008, 17:10
\psforeach{\nB}{\name}{%
\stepcounter{yVal}%
\uput[-90](\theyVal,0){\nB}}

Hat's gebracht!!

uihh, das habe ich gar nicht gewusst, dass das mit meinem
eigenen Code so einfach geht ... :D

Ich würde die Namen trotzdem unter 45 Grad setzen.

Herbert

Dr.Wackelzahn
30-11-2008, 17:12
Vielen Dank! Für die Anregungen und hilfreichen Hinweise. Habe jetzt den Code soweit, dass es für mich passt!
Ehrlich, ich mache daran schon seit Wochen rum, aber jetzt gehts wieder weiter.

Gibt's denn noch eine Möglichkeit das Skript so zu variieren, dass man gestapelte Balkendiagramme erstellen kann?

voss
30-11-2008, 17:15
Vielen Dank! Für die Anregungen und hilfreichen Hinweise. Habe jetzt den Code soweit, dass es für mich passt!
Ehrlich, ich mache daran schon seit Wochen rum, aber jetzt gehts wieder weiter.

Gibt's denn noch eine Möglichkeit das Skript so zu variieren, dass man gestapelte Balkendiagramme erstellen kann?

Grundsätzlich geht mir PSTricks alles, aber
sieh dir mal pst-bar an

Herbert

Dr.Wackelzahn
30-11-2008, 20:44
Nur noch eine kleine Sache:

Wie bekomme ich die Ticks auf die X-Achse mittig unter den Balken?

voss
30-11-2008, 22:07
Nur noch eine kleine Sache:

Wie bekomme ich die Ticks auf die X-Achse mittig unter den Balken?


\begin{psgraph}[Dy=500, dy=1cm,
yticksize=-10pt 0,subticks=5,
xticksize=0 -5pt,xsubticks=0](0,0)(30,6000){15cm}{12cm}


Herbert

Dr.Wackelzahn
30-11-2008, 22:16
Okay, passt schon fast, aber jetzt werden die Ticks zusätzlich von 0 - 15 beschriftet.
Gibt's da sowas wie xticklabel=false ?

voss
30-11-2008, 22:33
Okay, passt schon fast, aber jetzt werden die Ticks zusätzlich von 0 - 15 beschriftet.
Gibt's da sowas wie xticklabel=false ?

labels=y

Herbert

Dr.Wackelzahn
30-11-2008, 22:35
Perfekt!
Vielen Dank!

vci
01-12-2008, 18:45
Bei externen Daten etc kann man auch mal daran denken GnuPlot zu benutzen!

voss
01-12-2008, 21:25
Bei externen Daten etc kann man auch mal daran denken GnuPlot zu benutzen!

dann mach mal diese Abbildung in gnuplot.

Herbert