Die Fläche zwischen zwei (hier vereinfachten) Graphen kann mit pgfplots zum Beispiel so gefüllt werden:

\documentclass[margin=5mm]{standalone} 
\usepackage{pgfplots} 
\usepackage{filecontents}

\begin{filecontents}{plotdata.dat}
-2.5 0.5 -0.5 
-1 -1 1
0 0 0
1 1 -1
2.5 -0.5 0.5 
\end{filecontents}

\begin{document} 
\begin{tikzpicture} 
\begin{axis}
  \addplot[green]table[x index={0}, y index={1}]{plotdata.dat}; 
  \addplot[red]table[x index={0}, y index={2}]{plotdata.dat};

  \addplot[draw=none,stack plots=y,forget plot] table [y index={1}]{plotdata.dat}; 
  \addplot[draw=none, fill=gray, opacity=.5,stack plots=y]
    table [y expr=\thisrowno{2}-\thisrowno{1}] {plotdata.dat}\closedcycle; 
\end{axis} 
\end{tikzpicture} 
\end{document}

alt text

Nun soll aber die Farbe der Fläche grün sein, wenn der grüne Graph oberhalb des roten liegt. Im umgekehrten Fall soll die Fläche dagegen rot gefüllt werden.

Wie kann ich das erreichen?

gefragt 13 Nov '13, 17:23

esdd's gravatar image

esdd
17.8k284257
Akzeptiert-Rate: 62%

3

Automatische unterstuetzung fuer so ein Feature ist gerade in Arbeit. Voraussichtlich wird pgfplots ab der naechsten Version diese Aufgabe unterstuetzen.

(16 Nov '13, 18:53) cfeuersaenger

@cfeuersaenger: Super, dann ist ja eine praktikable Lösung in Aussicht.

(17 Nov '13, 00:29) esdd

Da Version 1.10 von pgfplots jetzt veröffentlicht ist, gibt es eine einfache Lösung für das Problem. Dazu muss die neue Bibliothek fillbetween geladen werden.

Open in writeLaTeX
\documentclass[margin=5mm]{standalone} 
\usepackage{pgfplots}
\pgfplotsset{compat=1.10} % mit writeLaTeX bisher noch nicht möglich
\usepgfplotslibrary{fillbetween}
\usepackage{filecontents}

\begin{filecontents}{plotdata.dat}
-2.5 0.5 -0.5 
-1 -1 1
0 0 0
1 1 -1
2.5 -0.5 0.5 
\end{filecontents}

\begin{document} 
\begin{tikzpicture} 
\begin{axis}
  \addplot[name path=plot1,green]table[x index={0}, y index={1}]{plotdata.dat}; 
  \addplot[name path=plot2,red]table[x index={0}, y index={2}]{plotdata.dat};
  % Füllung zwischen plots
  \addplot fill between[ 
    of=plot1 and plot2, 
    split, % Segmente berechnen lassen, Zählung beginnt bei 0 (also gerader Zahl)
    every even segment/.style= {green!10}, % Stil für die geraden Segmente
    every odd segment/.style={red!10}, % Stil für die ungeraden Segmente
 ]; 
\end{axis} 
\end{tikzpicture} 
\end{document}

alt text

Permanenter link

beantwortet 05 Mär '14, 10:51

esdd's gravatar image

esdd
17.8k284257
Akzeptiert-Rate: 62%

bearbeitet 05 Mär '14, 11:51

Als erstes muss man die Schnittpunkte der Plots bestimmen. Dann vier weitere Datensätze hinzufügen und jeweils in den Abschnitten zwischen zwei Schnittpunkten Null setzen:

\documentclass[margin=5mm]{standalone} 
\usepackage{pgfplots} 
\usepackage{filecontents}

\begin{filecontents}{plotdata.dat}
-2.5 0.5 -0.5 0.5 -0.5 0 0
-2 0 0 0 0 0 0
-1 -1 1 0 0 -1 1
0 0 0 0 0 0 0
1 1 -1 1 -1 0 0
2 0 0 0 0 0 0
2.5 -0.5 0.5 0 0 -0.5 0.5 
\end{filecontents}

\begin{document} 
\begin{tikzpicture} 
\begin{axis}
  \addplot[green]table[x index={0}, y index={1}]{plotdata.dat}; 
  \addplot[red]table[x index={0}, y index={2}]{plotdata.dat};

  \addplot[draw=none,stack plots=y,forget plot] table [y index={1}]{plotdata.dat}; 
  \addplot[draw=none, fill=green, opacity=.5,stack plots=y]
    table [y expr=\thisrowno{4}-\thisrowno{3}] {plotdata.dat}\closedcycle; 
  \addplot[draw=none, fill=red, opacity=.5,stack plots=y]
    table [y expr=\thisrowno{6}-\thisrowno{5}] {plotdata.dat}\closedcycle; 
\end{axis} 
\end{tikzpicture} 
\end{document}

alt text

Permanenter link

beantwortet 14 Nov '13, 21:08

sudo's gravatar image

sudo
2.0k51521
Akzeptiert-Rate: 39%

@sudo: Vielen Dank für deinen Vorschlag, der allerdings mit viel „Handarbeit“ verbunden ist, vor allem wenn die Kurven komplizierter werden.

(17 Nov '13, 00:35) esdd
Deine Antwort
Vorschau umschalten

Folgen dieser Frage

Per E-Mail:

Wenn sie sich anmelden, kommen Sie für alle Updates hier in Frage

Per RSS:

Antworten

Antworten und Kommentare

Markdown-Grundlagen

  • *kursiv* oder _kursiv_
  • **Fett** oder __Fett__
  • Link:[Text](http://url.com/ "Titel")
  • Bild?![alt Text](/path/img.jpg "Titel")
  • nummerierte Liste: 1. Foo 2. Bar
  • zum Hinzufügen ein Zeilenumbruchs fügen Sie einfach zwei Leerzeichen an die Stelle an der die neue Linie sein soll.
  • grundlegende HTML-Tags werden ebenfalls unterstützt

Frage-Themen:

×298

gestellte Frage: 13 Nov '13, 17:23

Frage wurde gesehen: 15,600 Mal

zuletzt geändert: 05 Mär '14, 11:51