PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : pgfplots Fläche zwischen zwei Kurven schraffieren



_Daniel_
04-08-2011, 19:35
Hallo zusammen,

ich habe gerade begonnen mich mit dem Paket pgfplot auseinander zu setzten. Ich schreibe gerade meine Masterarbeit mit Latex und möchte nun meine Messwerte plotten. Hier im Forum wurde mir dafür das Paket pgfplot empfohlen. Ich kannte bisher nur gnuplot.
Der User @ bobmalaria war sehr hilfreich und hat mir durch den Dschungel von Gnuplot, eps terminal, tikzs Terminal und pgf geholfen. Mitlerweile habe ich meine Plotts fast fertig und feile nur noch an ein paar "Kleinigkeiten". Dazu gehört u.a. noch das Makieren einer Fläche, die durch den Schnittpunkt zweier Kurven begrenzt wird. Also z.B. zwei Normalparabeln, eine nach oben, eine nach unten geöffnet. Wie ich die Fläche einer Kurve mit Schnittpunkten an der X-Achse schraffiere wurde mir von bobmalaria anhand eines Beispiels gezeigt http://mrunix.de/forums/showthread.php?t=71526&page=2 . Da er mich bisher quasi alleine unterhalten hat möchte ich mich noch einmal an die ganze Gemeinde wenden: Kann mir da jemand weiterhelfen? Irgendwie muss Gnuplot die beiden Schnittpunkte berechnet und mithilfe von pgfplot schraffieren. Mir fehlt dazu das Wissen. Das Manual habe ich gelesen, aber leider auch kein passendes Beispiel gefunden. Ebenso habe ich mich schon mit dem Tikz Manual beschäftigt und auch das www durchforstet...

Es wäre schön wenn jemand eine Idee hat oder so etwas schon mal gemacht hat und mir ein Beispiel präsentieren könnte.

Gruß Daniel

Feuersaenger
05-08-2011, 16:58
Hi Daniel,

Wenn es um das Fuellen zwischen zwei Kurven geht, braucht pgfplots noch mancherlei nachhilfe. Ich empfehle Dir Loesungsvorschlaege, die unter

http://tex.stackexchange.com/search?q=fill+pgfplots

diskutiert wurden, insbesondere

http://tex.stackexchange.com/questions/17517/fill-the-area-between-two-curves-calculated-by-pgfplots

oder

http://tex.stackexchange.com/questions/7914/fill-between-two-curves-in-pgfplots

Hilft das weiter?

Mit liebem Gruss

Christian

_Daniel_
06-08-2011, 13:19
Hi Christian,

danke für deine Hilfe.
Ich habe mir die Links gerade angesehen und probiert vor allem dieses Beispiel http://tex.stackexchange.com/questions/17517/fill-the-area-between-two-curves-calculated-by-pgfplots auf mein Problem zu übertragen.
Meine Kurven basieren allerdings auf Messwerten aus ca. 2500 Wertepaaren, die ich in einer Text- Datei in pfgplot einbinde.
Ob dann überhaupt gnuplot brauche weiß ich nicht. Vielleicht kann pfgplot die Subtraktion ja auch selbst durchführen. Meine Syntax sieht im Moment folgendermaßen aus:


\addplot+[mark=none,draw=none, pattern=north west lines,pattern color=red!50!yellow]gnuplot {'Datei.txt' using 2:5 - 'Datei.txt' using 2:6}
\closedcycle;

Ich sage erst, dass er die Kurven nicht zeichnen soll, dann definiere ich die Fläche, die schraffiert wird in der Farbe "pattern color=red!50!yellow". Anschließend rufe ich gnuplot auf. Hier muss ich dann ja die Syntax von gnuplot benutzten. Aus der Datei "Datei.txt" soll er die 2. und 5. Spalte, bzw. die 2. und 6. Spalte nehmen. Die erste Zeile, die für den pgfplot Spaltennamen enthält habe ich für gnuplot auskommentiert mit #. Ich bekomme jetzt nur die Warnung, dass er die Koordinaten nicht findet:


! Package pgfplots Warning: the current plot has no coordinates (or all have be
en filtered away)
PGFPlots: reading {Datei.txt}
PGFPlots: reading {Datei.txt}

Wahrscheinlich habe ich noch einen Fehler in der Syntax. Die Datei liegt sowohl in dem Ordner, indem das Latexfile liegt, hier müsste pgfplot bzw. gnuplot das finden, bzw. in dem Gnuplot/bin Ordner, weil er das file nicht finden konnte.

Also, dieses Flächen einfärben wäre zwar ein nettes Extra, ist jetzt aber nicht zwingend notwendig. Wenn du auf den ersten Blick den Fehler siehst, teile es mir bitte mit, aber verbringe keine Stunden auf der Suche nach dem Problem :-)
Ich habe da im Moment noch andere Baustellen die wichtiger sind. Dazu werde ich mich bestimmt auch noch mal im Forum melden.

Gruß Daniel

Feuersaenger
06-08-2011, 23:22
Hi Daniel,

wenn ich es recht verstehe, gibt es noch zwei Fragen hier:

a) kann pgfplots auch selber subtrahieren?

und

b) woher kommt die Fehlermeldung nach dem Einfuegen des Raute-kommentars?

Richtig?

Zu a): muesste gehen, weil die Datensaetze in derselben Datei sind. Pgfplots kann das mit

\addplot table[y expr={\thisrow{Spaltenname1} - \thisrow{Spaltenname2}}] {Datei.txt};

oder alternativ \thisrowno{1} - \thisrowno{0} oder was auch immer. Wichtig ist 'table' als input und 'y expr', um den Ausdruck zu bestimmen.

zu b) ich vermute, dass Du die Datei auch irgendwo mit pgfplots laedst, oder? Falls ja: pgfplots versteht '#' *auch* als Kommentarzeichen, d.h. der wuerde dann durch das einfuegen des kommentars keine Spaltennamen mehr haben.

Mit liebem Gruss

Christian

_Daniel_
07-08-2011, 13:15
Hi, nachdem das andere Problem gelöst ist, noch mal zu den schraffierten Flächen:

Ich habe dein Beispiel ausprobiert: \addplot table[y expr={\thisrow{Spaltenname1} - \thisrow{Spaltenname2}}] {Datei.txt};

Leider scheitert pgfplot an der Größe der Daten. Es gab die Fehlermeldung "Dimension too large". Daraufhin habe ich es noch mal mit gnuplot probiert und ein Minimalbeispiel erstellt. Die Daten scheint er jetzt zu finden. Für das richtige Texfile habe ich für den Aufruf der Daten über pgfplot eine Datei mit Spaltenbeizeichnung und für den Aufruf über gnuplot die Spaltenbeizeichnung auskommentiert (mit der Raute), also zwei Dateien erstellt. Das hatte ich verschwiegen.
Für das Minimalbeispiel habe ich jetzt ein paar Werte in der Texdatei erstellt.
Ich denke es scheitert noch an der richtigen Syntax. Vielleicht kannst du, oder jemand anders mir weiterhelfen. Ich hatte gerade auch schon im Inet nach einem Beispiel gesucht, das ich übernehmen könnte, allerdings ohne Erfolg.


\begin{filecontents}{dat1.dat}
1 20 20
5 20 20
15 25 20
25 30 20
35 25 20
45 20 20
50 15 20
\end{filecontents}




\documentclass[%
a4paper,% Wir verwenden A4 Papier.
oneside,% Einseitiger Druck.
12pt,% Grosse Schrift, besser geeignet für A4.
halfparskip,% Halbe Zeile Abstand zwischen Absätzen.
idxtotoc% Index ins Inhaltsverzeichnis einfügen.
bibliography
]{scrartcl}
\thispagestyle{empty}
%\usepackage[left=3.0cm,right=2cm,top=1cm,bottom=2cm]{geometry}

\usepackage{tikz}
\usetikzlibrary{patterns}
\usepackage{xcolor}
\usepackage{pgfplots}
\pgfplotsset{compat=1.3}% <-- moves axis labels near ticklabels (respects tick label widths)
\usepackage[latin1]{inputenc} %9
\usepackage[T1]{fontenc}

\begin{document}


\begin{tikzpicture}
\begin{axis}
[width=14cm,height=10cm,
xmin=0,xmax=60
xtick={0,15,30,45,60},
ymin=0,ymax=45,
ytick={0,5,10,15,20,25,30,35,40,45}, % ymin und max
minor x tick num=2,
minor y tick num =4,
xlabel={X},
ylabel={Y},
grid=major
]

\addplot[mark=none,draw=none, pattern=north west lines,pattern color=red!50!yellow]gnuplot {{file 'dat1' using 1:2} - {file 'dat1' using 1:3}},
\closedcycle;


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



Gruß Daniel