PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [pgfplots] Pfeile der Diagrammachsen vergrößern und von Werten absetzen



Silmaril
08-10-2012, 22:49
Hallo zusammen

Zuerst möchte ich kurz Hallo sagen. Bin neu im Forum und sehr froh, dass ich solch ein Forum gefunden habe. Ich bin zwar kein blutiger Latex-Anfänger mehr, aber viel Erfahrung habe ich noch nicht. Bisher setzte ich Latex bei zwei Berichten ein und erstelle zur Zeit ein Satz an Vorlagen. Ich plane Latex für regelmäßig wiederkehrende Berichte, ein Pflichtenheft und eine Dokumentation einzusetzen.

Jetzt zu meinem aktuellen Problem:

Ich möchte mit pgfplots Messwertdiagramme zeichnen. Ich möchte eine möglichst gute Lösung finden, die ich später immer wieder bei ähnlichen Diagrammen einsetzen kann und nur die Datei mit den Daten austauschen muss.

Das habe ich:



\documentclass[a4paper,12pt]{scrartcl}
\usepackage{pgfplots}

\usepackage{filecontents}
\begin{filecontents}{diagramm.dat}
Spannung Strom
1 0.1
2 0.14
3 0.2
4 0.5
5 0.4
6 0.6
7 0.3
8 1
\end{filecontents}

\begin{document}

\pgfkeys{/pgf/number format/.cd ,use comma}
\pgfplotsset{every axis label/.append style={font=\scriptsize},
every tick label/.append style={font=\scriptsize}, xtick=data}

\begin{tikzpicture}
\begin{axis}[
title={Der Titel des Diagramms},
width=0.9\textwidth,
height=7cm,
xlabel=Spannung {[}V{]},ylabel=Strom {[}I{]},
axis x line=bottom,
axis y line=left,
ymin = 0,
% enlarge x limits=0.1
]

\addplot+[smooth] table {diagramm.dat};
\end{axis}
\end{tikzpicture}
\end{document}


So weit ist alles ganz gut. Aber die Pfeile der Diagrammachsen gefallen mir nicht. Sie sind mir zu zu klein (die kann man ja kaum erkennen) und vor allem sitzen sie einfach genau über den letzen Wert.
Bei der x-Achse kann man sich ja noch dadurch helfen, in dem man das auskommentierte enlarge x limits=0.1 einsetzt. Für die y-Achse funktioniert es aber oft nicht.

Das sauberste wäre es, wenn man die Pfeile einfach ein bisschen von den Werten nach oben bzw, links absetzen könnte oder einen (Mindest-)Abstand zwischen letzen angezeichneten Wert und Pfeil definieren kann.

Vielleicht gibt es auch eine einfache Möglichkeit die Labels der Achsen immer in die Nähe der Pfeile zu bekommen?

Also meine drei Fragen:

Wie bekomme ich die Pfeile weg von den Werten?
Wie mach ich die Pfeile etwas größer?
Wie bekomme ich die Achsenbeschriftung an die Pfeile?


Schönen Gruß

bobmalaria
09-10-2012, 10:33
hi,

eigentlich sollte es reichen 'enlargelimits' als option zu setzen, oder?
das mit den pfeilen wurde hier mal besprochen
http://tex.stackexchange.com/questions/51555/changing-arrowheads-size-in-pgfplots-axes

uebrigens werden einheiten nicht mit []-klammern gesetzt. soviel ich weiss darf man die spannung als [U] ausdruecken, aber die einheit der spannung ist einfach volt, ohne klammern.

esdd
09-10-2012, 15:05
Hallo,

du kannst auch eine andere Pfeilform aus der tikzlibrary arrows versuchen. enlargelimits=upper verlängert dir die y-Achse nach oben und die x-Achse nach rechts. Hier ist auch noch ein Vorschlag, wie die Labels in der Nähe der Pfeile positioniert werden können:

\documentclass{scrartcl}
\usepackage{pgfplots}
\pgfplotsset{compat=1.6}
\usetikzlibrary{arrows}

\usepackage{filecontents}
\begin{filecontents}{diagramm.dat}
Spannung Strom
1 0.1
2 0.14
3 0.2
4 0.5
5 0.4
6 0.6
7 0.3
8 1
\end{filecontents}

\begin{document}

\pgfkeys{/pgf/number format/.cd ,use comma}
\pgfplotsset{%
every axis label/.append style={font=\scriptsize},
every tick label/.append style={font=\scriptsize},
xtick=data}

\begin{tikzpicture}
\begin{axis}[
title={Der Titel des Diagramms},
width=0.8\textwidth,
height=7cm,
xlabel=Spannung {[}V{]},ylabel=Strom {[}I{]},
axis x line=bottom,
x axis line style={-triangle 45},
x label style={at={(1,0)}, below right},
axis y line=left,
y axis line style={-triangle 45},
y label style={rotate=-90,at={(0,1)}, above left},
enlargelimits=upper,
ymin = 0,
]
\addplot+[smooth] table {diagramm.dat};
\end{axis}
\end{tikzpicture}
\end{document}

Gruß
Elke

Silmaril
09-10-2012, 17:25
Hallo

Vielen Dank für die tollen Antworten. Die haben mich deutlich weitergebracht:

Das von bobmalaria verlinkte Möglichkeit, die Pfeile größer zu machen klappt genauso gut wie die von esdd. Ich werde esdds Vorschlag nehmen. So gehts ziemlich einfach und sauber. Danke!

Beim Problem mit den Labels ist esdds Vorschlag auch sehr ziehlführend. Allerdings habe ich es etwas verändert.

Bei den Abstand zwischen Pfeil und höchsten gezeichneten Wert bin ich noch nicht entscheidend weitergekommen. (Ich muss zugeben, dass ich davor bei enlarge-Optionen nicht alle Argumente durchprobiert habe.) Es kommt wohl immer darauf an was der höchste Wert des Diagramms ist. In meinen Beispiel sieht man glaube ich gut, was das Problem ist:



\documentclass[a4paper,12pt]{scrartcl}
\usepackage{pgfplots}
\usetikzlibrary{arrows}

\usepackage{filecontents}
\begin{filecontents}{diagramm1.dat}
Spannung Strom
1 0.1
2 0.4
3 0.6
4 0.3
5 1.1
\end{filecontents}
\begin{filecontents}{diagramm2.dat}
Spannung Strom
1 0.1
2 0.4
3 0.6
4 0.3
5 1.0
\end{filecontents}

\begin{document}

\pgfkeys{/pgf/number format/.cd ,use comma}
\pgfplotsset{every axis label/.append style={font=\scriptsize},
every tick label/.append style={font=\scriptsize}, xtick=data}

\begin{tikzpicture}
\begin{axis}[
xlabel = {[}U{]} in V, ylabel={[}I{]} in mA,
width = 0.5\textwidth,
height = 7cm,
axis x line=bottom,
x axis line style={-triangle 45},
x label style={at={(1,0)}, below},
axis y line=left,
y axis line style={-triangle 45},
y label style={at={(0,1)}, above left},
ymin = 0,
% enlargelimits = upper,
enlarge x limits = upper
]
\addplot+[smooth] table {diagramm1.dat};
\end{axis}
\end{tikzpicture}

\begin{tikzpicture}
\begin{axis}[
xlabel = {[}U{]} in V, ylabel={[}I{]} in mA,
width = 0.5\textwidth,
height = 7cm,
axis x line=bottom,
x axis line style={-triangle 45},
x label style={at={(1,0)}, below},
axis y line=left,
y axis line style={-triangle 45},
y label style={at={(0,1)}, above left},
ymin = 0,
% enlargelimits = upper,
enlarge x limits = upper
]
\addplot+[smooth] table {diagramm2.dat};
\end{axis}
\end{tikzpicture}
\end{document}


Im unteren Diagramm müsste ich jetzt statt der Zeile enlargelimits = upper, die Zeile enlarge x limits = upper auskommentieren. Und ich glaube, wenn es andere Werte gibt und die y-Achse dementsprechend eine andere Einteilung hat, muss ich wieder rumprobieren.
Also den Anspruch, einer allgemeingültige Lösung, näher ich mich damit nicht.

PS: @bobmalaria: Das mit den Einheiten stimmt. War ja auch eher ein Quick&Dirty-Beispiel :)

esdd
09-10-2012, 18:34
Hallo,

in der Präambel habe ich noch \pgfplotsset{compat=1.6} stehen, damit die Möglichkeiten der aktuellen Version genutzt werden. Ansonsten sind hier noch zwei Vorschläge, wie du das Labelproblem lösen kannst. Aber du wirst das sicher für jedes Diagramm neu entscheiden und je nach Bedarf unterschiedliche Werte für die Optionen nehmen müssen. Die Verlängerung der Achsen kann man zum Beispiel relativ oder absolut einstellen.

\documentclass[a4paper,12pt]{scrartcl}
\usepackage{pgfplots}
\pgfplotsset{compat=1.6}
\usetikzlibrary{arrows}

\usepackage{filecontents}
\begin{filecontents}{diagramm1.dat}
Spannung Strom
1 0.1
2 0.4
3 0.6
4 0.3
5 1.1
\end{filecontents}
\begin{filecontents}{diagramm2.dat}
Spannung Strom
1 0.1
2 0.4
3 0.6
4 0.3
5 1.0
\end{filecontents}

\begin{document}

\pgfkeys{/pgf/number format/.cd ,use comma}
\pgfplotsset{every axis label/.append style={font=\scriptsize},
every tick label/.append style={font=\scriptsize}, xtick=data}

\begin{tikzpicture}
\begin{axis}[
xlabel = {[}U{]} in V, ylabel={[}I{]} in mA,
width = 0.5\textwidth,
height = 7cm,
axis x line=bottom,
x axis line style={-triangle 45},
x label style={at={(1,0)}, below},
enlarge x limits = {abs value=1,upper},
axis y line=left,
y axis line style={-triangle 45},
y label style={at={(0,1)},left,anchor=south},
ymin = 0,
ytick={0,0.2,0.4,...,1},
enlarge y limits = {abs value=0.15,upper}
]
\addplot+[smooth] table {diagramm1.dat};
\end{axis}
\end{tikzpicture}

\begin{tikzpicture}
\begin{axis}[
xlabel = {[}U{]} in V, ylabel={[}I{]} in mA,
width = 0.5\textwidth,
height = 7cm,
axis x line=bottom,
x axis line style={-triangle 45},
x label style={at={(1,0)}, below},
enlarge x limits = {abs value=1,upper},
axis y line=left,
y axis line style={-triangle 45},
y label style={at={(0,1)},left,anchor=south},
ymin = 0,
ytick=data,
enlarge y limits = {abs value=0.2,upper}
]
\addplot+[smooth] table {diagramm2.dat};
\end{axis}
\end{tikzpicture}
\end{document}
Gruß
Elke

Silmaril
09-10-2012, 19:26
Hallo

\pgfplotsset{compat=1.6} bringt bei mir:



Package pgfkeys Error: Choice '1.6' unknown in key '/pgfplots/compat/labels' \pgfplotsset{compat=1.6}


ein \pgfplotsset{compat=1.5} bewirkt, dass die Labels direkt an die Achse rücken und die Werte überdecken. Meine aber, dass man das mit einer Option wieder gerade biegen könnte. An den Position der Pfeile ändert es nichts.

Benutze Ubuntu. Also vermutlich das TexLive von 2009

Den Rest möchte ich mir nach dem Abendessen ansehen. Danke schon mal :)

esdd
09-10-2012, 21:15
Hallo,

dann mit compat=1.5 und nach von den Achsen weg geschobenen Labeln. Links immer mit einer absoluten Verlängerung der Achsen und rechts mit einer relativen. Wird nur upper angegeben, dann wird die Achse um 0.1=10% verlängert.

\documentclass[a4paper,12pt]{scrartcl}
\usepackage{pgfplots}
\pgfplotsset{compat=1.5}
\usetikzlibrary{arrows}

\usepackage{filecontents}
\begin{filecontents}{diagramm1.dat}
Spannung Strom
1 0.1
2 0.4
3 0.6
4 0.3
5 1.1
\end{filecontents}
\begin{filecontents}{diagramm2.dat}
Spannung Strom
1 0.1
2 0.4
3 0.6
4 0.3
5 1.0
\end{filecontents}

\begin{document}

\pgfkeys{/pgf/number format/.cd ,use comma}
\pgfplotsset{every axis label/.append style={font=\scriptsize},
every tick label/.append style={font=\scriptsize}, xtick=data}

\begin{tikzpicture}
\begin{axis}[
xlabel = {[}U{]} in V, ylabel={[}I{]} in mA,
width = 0.5\textwidth,
height = 7cm,
axis x line=bottom,
x axis line style={-triangle 45},
x label style={at={(1,0)},below,yshift=-20pt,anchor=north east,inner sep=0pt},
enlarge x limits = {abs value=0.5,upper},
axis y line=left,
y axis line style={-triangle 45},
y label style={at={(0,1)},yshift=20pt,left,anchor=south east,inner sep=0pt},
ymin = 0,
enlarge y limits = {abs value=0.09,upper}
]
\addplot+[smooth] table {diagramm1.dat};
\end{axis}
\end{tikzpicture}
\hfill
\begin{tikzpicture}
\begin{axis}[
xlabel = {[}U{]} in V, ylabel={[}I{]} in mA,
width = 0.5\textwidth,
height = 7cm,
axis x line=bottom,
x axis line style={-triangle 45},
x label style={at={(1,0)},below,yshift=-20pt,anchor=north east,inner sep=0pt},
enlarge x limits = {upper},
axis y line=left,
y axis line style={-triangle 45},
y label style={at={(0,1)},yshift=20pt,left,anchor=south east,inner sep=0pt},
ymin = 0,
enlarge y limits = {value=0.09,upper}
]
\addplot+[smooth] table {diagramm1.dat};
\end{axis}
\end{tikzpicture}

\begin{tikzpicture}
\begin{axis}[
xlabel = {[}U{]} in V, ylabel={[}I{]} in mA,
width = 0.5\textwidth,
height = 7cm,
axis x line=bottom,
x axis line style={-triangle 45},
x label style={at={(1,0)},below,yshift=-20pt,anchor=north east,inner sep=0pt},
enlarge x limits = {abs value=0.5,upper},
axis y line=left,
y axis line style={-triangle 45},
y label style={at={(0,1)},yshift=20pt,left,anchor=south east,inner sep=0pt},
ymin = 0,
enlarge y limits = {abs value=0.1,upper}
]
\addplot+[smooth] table {diagramm2.dat};
\end{axis}
\end{tikzpicture}
\hfill
\begin{tikzpicture}
\begin{axis}[
xlabel = {[}U{]} in V, ylabel={[}I{]} in mA,
width = 0.5\textwidth,
height = 7cm,
axis x line=bottom,
x axis line style={-triangle 45},
x label style={at={(1,0)},below,yshift=-20pt,anchor=north east,inner sep=0pt},
enlarge x limits = {upper},
axis y line=left,
y axis line style={-triangle 45},
y label style={at={(0,1)},yshift=20pt,left,anchor=south east,inner sep=0pt},
ymin = 0,
enlarge y limits = {upper}
]
\addplot+[smooth] table {diagramm2.dat};
\end{axis}
\end{tikzpicture}
\end{document}
Gruß
Elke

Silmaril
10-10-2012, 00:29
Elke du bist genial ;-) Es funktioniert nicht nur (bis her), ich blick jetzt auch halbwegs dahinter.

Eine Frage vielleicht noch: Warum bewirkt ein {abs value=0.09,upper} hier das gleiche wie ein {value=0.09,upper}? Oder anders gefragt: Auf was bezieht sich der relative bzw. absolute Wert?

Gibt es vielleicht noch eine Möglichkeit einer Achse zu sagen, dass sie auf für "ausgelassene" Werte, die also nicht angeschrieben sind, einen Strich zeichnen soll? Also hier für 0,1 0,3 0,5 usw auf der y-Achse. Ohne die einzelnen Tick natürlich einzeln einzutragen. Wenn das aber nicht so einfach geht, ist es auch nicht so wichtig.

Gruß

esdd
10-10-2012, 11:16
Die Option, mit der du zwischen den beschrifteten Ticks an der y-Achse je einen weiteren einfügen lassen kannst, heißt "minor y tick num=1". Die zusätzlichen Striche machen es natürlich schwieriger die Achse so zu verlängern, dass kein Tick in unmittelbarer Nähe des Pfeiles ist ...

Das "abs value=0.09,upper" verlängert die eigentlich bis 1,1 gehende y-Achse um den absoluten Wert 0,09 auf 1,19. Das "value=0.09,upper" verlängert die y-Achse um 9% der sonst bis 1,1 gehenden Achse, also auf 1,199. Den Unterschied sieht man kaum, aber beides verhindert, dass bei 1,2 ein weiterer Tick gezeichnet wird.

Gruß
Elke

Silmaril
10-10-2012, 16:24
Ah, jetzt wird das logisch. Ich hatte aus irgend einen Grund gedacht, die Ticks werden nur im Wertebereich der Messwerte gezeichnet und wenn man die Achse verlängert, verlängert sich eben nur der Strich. Mit deiner Erklärung ist aber die Sache klar: Ich muss nur darauf achten, dass die Achse (höchstens) bis kurz vor dem nächsten Tick verlängert wird. Eigentlich ganz einfach :)

Die zusätzlichen Ticks funktionieren auch.

Danke nochmal für deine großartige Hilfe. Jetzt versteh ich das Paket viel besser :)

esdd
10-10-2012, 21:12
Hallo,


Ich hatte aus irgend einen Grund gedacht, die Ticks werden nur im Wertebereich der Messwerte gezeichnet und wenn man die Achse verlängert, verlängert sich eben nur der Strich.
Für deine xticks stimmt das wegen "\pgfplotsset{...,xtick=data}". Die Option sorgt dafür, dass die xticks genau an den Stellen gezeichnet werden, an denen du Werte für den Plot vorgibst. Ich hab die Verlängerung der x-Achse hier mal übertrieben und im zweiten Beispiel mal einen x-Wert etwas verändert:

\documentclass[a4paper,12pt]{scrartcl}
\usepackage{pgfplots}
\pgfplotsset{compat=1.5}
\usetikzlibrary{arrows}

\usepackage{filecontents}
\begin{filecontents}{diagramm1.dat}
Spannung Strom
1 0.1
2 0.4
3 0.6
4 0.3
5 1.1
\end{filecontents}

\begin{document}

\pgfkeys{/pgf/number format/.cd ,use comma}
\pgfplotsset{every axis label/.append style={font=\scriptsize},
every tick label/.append style={font=\scriptsize}, xtick=data}

\begin{tikzpicture}
\begin{axis}[
xlabel = {[}U{]} in V, ylabel={[}I{]} in mA,
width = 0.5\textwidth,
height = 7cm,
axis x line=bottom,
x axis line style={-triangle 45},
x label style={at={(1,0)},below,yshift=-20pt,anchor=north east,inner sep=0pt},
enlarge x limits = {abs value=3,upper},
axis y line=left,
y axis line style={-triangle 45},
y label style={at={(0,1)},yshift=20pt,left,anchor=south east,inner sep=0pt},
ymin = 0,
minor y tick num=1,
enlarge y limits = {abs value=0.09,upper}
]
\addplot+[smooth] table {diagramm1.dat};
\end{axis}
\end{tikzpicture}
\hfill
\begin{tikzpicture}
\begin{axis}[
xlabel = {[}U{]} in V, ylabel={[}I{]} in mA,
width = 0.5\textwidth,
height = 7cm,
axis x line=bottom,
x axis line style={-triangle 45},
x label style={at={(1,0)},below,yshift=-20pt,anchor=north east,inner sep=0pt},
enlarge x limits = {abs value=3,upper},
axis y line=left,
y axis line style={-triangle 45},
y label style={at={(0,1)},yshift=20pt,left,anchor=south east,inner sep=0pt},
ymin = 0,
minor y tick num=1,
enlarge y limits = {abs value=0.09,upper}
]
\addplot+[smooth] table {diagramm2.dat};
\end{axis}
\end{tikzpicture}
\end{document}
Gruß
Elke