PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : pgfplots: stacked plots - fester Betrag



borose
22-07-2010, 11:04
Hallo,

mit pgfplots möchte ich insgesamt 4 Plots in einem Diagramm zeichnen lassen. Allerdings liegen diese eng beieinander, so dass ich diese gern mit einem y-offset versehen möchte. D.h. wenn z.B. Plot 2 bei x=10 einen y-Wert von 20 hat, so soll der y-Wert um den Offeset erhöht werden. bei einem y-Offset von 10 wäre der Wert von Plot 2 an bei x=10 dann also 30.

pgfplots bietet eine ähnliche Funktion: Sie nennt sich "stack plots=y". Allerdings werden da einfach die y-Werte der Plots addiert, und nicht wie ich gern möchte, jeder Plot bei allen x Werten um einen jeweils anderen (festen) Betrag.

Man kann den plot verschieben, indem man \addplot+[yshift=10pt] verwendet. Allerdings wird da nicht auf das axis Koordinatensystem zurückgegegriffen, sondern auf das "normale". Ich hätte aber gern, dass der Plot nicht um 10pt nach obern verschoben wird, sondern um 10 y-Einheiten.

Hat jemand eine Idee? Wäre dankbar!

Feuersaenger
28-08-2010, 14:30
Hallo borose,

Es gibt die Moeglichkeit, plot koordinaten waehrend der Verarbeitung zu veraendern.

In Deinem Fall koennte man einen solchen koordinatenfilter fuer jeden separaten plot befehl verwenden. Der Filter koennte so aussehen, dass er zu jeder y koordinate denselben wert addiert, bspw.

\pgfmathadd{<alter wert>}{20}

Waere das was? Ich habe das mal in einem gesamtbeispiel zusammengefasst:


\documentclass[a4paper]{article}

\usepackage{pgfplots}

\begin{document}

\begin{tikzpicture}
\begin{axis}
\addplot {x};
\addlegendentry{no shift}
\addplot+[
y filter/.code={\pgfmathadd{\pgfmathresult}{10}},
]
{x};
\addlegendentry{shift 10}

\addplot+[
y filter/.code={\pgfmathadd{\pgfmathresult}{20}},
]
{x};
\addlegendentry{shift 20}
\end{axis}
\end{tikzpicture}
\end{document}


Das '+' funktioniert genauso wie schon in Deinem Ansatz mit yshift und addiert die optionen zu den cycle list sachen.

Details zu dem y filter findest Du im Manual, in der referenz irgendwo hinten.

Mit liebem Gruss

Christian

borose
30-08-2010, 09:46
Hi Christian!

Vielen Dank! Ich hatte nicht mehr mit einer Antwort gerechnet. y filter erledigt genau das was ich wollte! Wie einfach ... :)

Nur nebenbei, ich hatte mir damit beholfen:



\path let \p1=($(axis cs:0,0)-(axis cs:0,10)$),\n1={veclen(\x1,\y1)}%
in node at (100,10) {\n1};

Es schreibt den Abstand von den Koordinaten, die 10 y-einheiten entfernt sind in einen Node. das Ergebnis hab ich dann aus dem PDF-Dokument herauskopiert und dann in yshift verfrachtet:


\def\shiftoffset{22.02410pt}
\addplot+[yshift=\shiftoffset*\plotnum]
table[col sep=semicolon,x=E,y=I-HB]{datatoPlot/ESEM.csv};

Nicht ganz elegant, hat aber auch funktioniert - man muss nur, wenn man etwas am Layout schraubt den Abstanf neu auslesen. So muss man sich um nix mehr kümmern. Habs abgeändert und bin nun glücklich :)

Wäre das nicht eine Idee für ein einfach zu implementierendes Feature in deinem, wie ich finde, wirklich gelungenem Package?

Viele Grüße!

Feuersaenger
31-08-2010, 08:25
Hallo borose,

freut mich, dass das hilft.

Deine Anregung mit shift geht auch direkt in tikz, mithilfe der "calc" library:



\documentclass[a4paper]{article}

\usepackage{pgfplots}
\usetikzlibrary{calc}

\begin{document}

\begin{tikzpicture}
\begin{axis}
\addplot {x};
\addlegendentry{no shift}
\addplot+[
shift={($(axis cs:0,10) - (axis cs:0,0)$)},
%--------------------------------------------------
% yshift=
% y filter/.code={\pgfmathadd{\pgfmathresult}{10}},
%--------------------------------------------------
]
{x};
\addlegendentry{shift 10}

\addplot+[
y filter/.code={\pgfmathadd{\pgfmathresult}{20}},
]
{x};
\addlegendentry{shift 20}
\end{axis}
\end{tikzpicture}
\end{document}


der Nachteil: auf diese Weise weiss PGFPLots nix davon. In dem Fall wuerde bspw. die 'clickable' lib nicht ordentlich klappen; ausserdem produziert es schwierigkeiten mit der legende -- denn diese uebernimmt standardmaessig dieselben Anzeigeoptionen (inklusive shift). Fuer die legende muesste man also sonderbehandlungen machen (geht alles, natuerlich). Einfacher ist es da m.E., wenn man das auf hohem Level (d.h. auf coordinaten) hinbekommt.

Mit liebem Gruss

Christian

borose
31-08-2010, 10:05
Christian, nochmals vielen Dank für deine Hilfe!

Jetzt weiß ich auch, dass man nicht nur xshift und yshift verwenden kann, sondern der shift-option normale koordinaten übergeben kann. Wie praktisch :)

Viele Grüße