Anzeige:
Ergebnis 1 bis 5 von 5

Thema: pgfplots: stacked plots - fester Betrag

  1. #1
    Registrierter Benutzer
    Registriert seit
    10.09.2009
    Beiträge
    98

    pgfplots: stacked plots - fester Betrag

    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!

  2. #2
    Registrierter Benutzer
    Registriert seit
    23.07.2010
    Beiträge
    96

    Re: pgfplots: fester Betrag

    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{}{20}

    Waere das was? Ich habe das mal in einem gesamtbeispiel zusammengefasst:
    Code:
    \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

  3. #3
    Registrierter Benutzer
    Registriert seit
    10.09.2009
    Beiträge
    98

    Post

    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:

    Code:
    \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:

    Code:
    \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!

  4. #4
    Registrierter Benutzer
    Registriert seit
    23.07.2010
    Beiträge
    96
    Hallo borose,

    freut mich, dass das hilft.

    Deine Anregung mit shift geht auch direkt in tikz, mithilfe der "calc" library:
    Code:
    \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
    Geändert von Feuersaenger (31-08-2010 um 08:27 Uhr) Grund: CODE eingefuegt

  5. #5
    Registrierter Benutzer
    Registriert seit
    10.09.2009
    Beiträge
    98
    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

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •