Füllen Sie den Bereich unter mindestens zwei Funktionen mit Tikz und Pgfplots

Füllen Sie den Bereich unter mindestens zwei Funktionen mit Tikz und Pgfplots

Ich lade zwei Kurven aus einer Datei und stelle sie grafisch dar. \addplot table [...] {the table.txt};Ich habe es geschafft, den Bereich unter einer einzelnen Kurve auszufüllen, möchte aber, dass nur der kleinste Bereich der beiden Kurven ausgefüllt wird. Wie kann ich dies am besten mit Tikz und PGFlots erreichen? Das Bild zeigt ein Beispiel für das gewünschte Ergebnis.

Vielen Dank für jede Hilfe.

Bildbeschreibung hier eingeben

Antwort1

Dies kann mithilfe der Bibliothek erfolgen , die mit der Version 1.10 fillbetweenausgeliefert wird :pgfplots

Bildbeschreibung hier eingeben

\documentclass{standalone}

\usepackage{pgfplots}

\pgfplotsset{compat=1.9}

% \usetikzlibrary{}
\usepgfplotslibrary{fillbetween}


\begin{document}

\begin{tikzpicture}
    \begin{axis}[axis on top,set layers]
    \addplot[blue,name path=A,domain=0:2.3] {sin(deg(2*x))};    

    \addplot[red,name path=B,domain=0:2.3] {cos(deg(2*x))};

    \pgfonlayer{pre main}
    \fill[blue!20!white,intersection segments={of=A and B,sequence={A0 -- B1 -- A2}}]
        -- (axis cs:2.3,\pgfkeysvalueof{/pgfplots/ymin})
        -- (axis cs:0,\pgfkeysvalueof{/pgfplots/ymin})
        -- cycle
    ;
    \endpgfonlayer
    \end{axis}
\end{tikzpicture}
\end{document}

intersection segmentsDie Idee ist, die neuen Pfadanweisungen von zu verwenden fillbetween. Sie akzeptiert zwei beschriftete Pfade als Eingabe und eine Anzahl sequencevon Schnittpunkten. Derzeit muss das „Minimum“ manuell angegeben werden. In Ihrem Fall müssen Sie das erste (0.) Segment der ersten (A) Kurve ( A0) verwenden, dann das zweite (1.) der zweiten Kurve (B), das ist B1, gefolgt vom dritten (2.) Segment der ersten Kurve, das ist A2. Die anderen Anweisungen geben die untere Linie des gefüllten Bereichs an. Die Schichtungsanweisungen set layersund \pgfonlayerstellen sicher, dass das Material hinter den beschrifteten Eingabepfaden erscheint.

Beachten Sie, dass die Version 1.10 zum Zeitpunkt des Schreibens dieses Artikels noch sehr neu ist. Möglicherweise benötigen Sie ein Software-Upgrade.

Antwort2

clipEine weitere Alternative ist die zweimalige Verwendung ohne fillbetweenBibliothek. Füllen Sie zuerst den Bereich unter der Sinuskurve und bereinigen Sie dann den Bereich über der Cosinuskurve.

Bildbeschreibung hier eingeben

Code:

\documentclass{article}
\usepackage[papersize={11cm,10cm}]{geometry}
\usepackage{pgfplots}
\pgfplotsset{compat=1.8}
\thispagestyle{empty}

\begin{document}

\begin{tikzpicture} 
\begin{axis}[enlargelimits=0.1]
\begin{scope}
\clip(axis cs:0,-1.19) -- (axis cs:2.3,-1.19) -- (axis cs:2.3,1)-- (axis cs:0,1)--  cycle;
\addplot[draw=white,fill=blue!20!white,domain=0:2.3] {sin(deg(2*x))}--(axis cs:2.3,-1.5) --(axis cs:0,-1.5);    
\end{scope}

\begin{scope}
\clip (axis cs:2.3,-1) -- (axis cs:2.3,1) -- (axis cs:0,1)-- (axis cs:0,-1)--cycle;
\addplot[draw=white,fill=white,domain=0:2.3] {cos(deg(2*x))}--(axis cs:2.3,1)--(axis cs:0,1);
\end{scope}
\addplot[red,domain=0:2.3] {cos(deg(2*x))};
\addplot[blue,domain=0:2.3] {sin(deg(2*x))};
\end{axis}
\end{tikzpicture}  
\end{document}

Antwort3

Nur um die Frage mit PSTricks abzuschließen.

Postfix-Darstellung

\documentclass[pstricks,border=12pt]{standalone}
\usepackage{pst-plot,pst-eucl}

\def\f{x RadtoDeg sin 2 mul 3 add}
\def\g{x RadtoDeg cos 2 mul 3 add}

\begin{document}
\begin{pspicture}[saveNodeCoors,PointName=none,PointSymbol=none](-1,-1)(7,6)
    \pstInterFF{\f}{\g}{1}{A}
    \pstInterFF{\f}{\g}{4}{B}
    \pscustom[linestyle=none,fillstyle=solid,fillcolor=lightgray]
    {
        \psplot{.5}{N-A.x}{\f}
        \psplot{N-A.x}{N-B.x}{\g}
        \psplot{N-B.x}{6}{\f}
        \psline(6,0)(.5,0)
        \closepath
    }
    \psaxes[ticks=none,labels=none]{->}(0,0)(-1,-1)(6.5,5.5)[$x$,0][$y$,90]
    \psplot[linecolor=blue]{0}{TwoPi}{\f}
    \psplot[linecolor=red]{0}{TwoPi}{\g}
\end{pspicture}
\end{document}

Bildbeschreibung hier eingeben

Infix-Darstellung

Wenn Sie lieber mit Infix arbeiten, verwenden Sie Folgendes.

\documentclass[pstricks,border=12pt]{standalone}
\usepackage{pst-plot,pst-eucl}

\def\f{(2*sin(x)+3)}
\def\g{(2*cos(x)+3)}

\pstVerb{/I2P {AlgParser cvx exec} def}

\begin{document}
\begin{pspicture}[algebraic,saveNodeCoors,PointName=none,PointSymbol=none](-1,-1)(7,6)
    \pstInterFF{\f I2P}{\g I2P}{1}{A}
    \pstInterFF{\f I2P}{\g I2P}{4}{B}
    \pscustom[linestyle=none,fillstyle=solid,fillcolor=lightgray]
    {
        \psplot{.5}{N-A.x}{\f}
        \psplot{N-A.x}{N-B.x}{\g}
        \psplot{N-B.x}{6}{\f}
        \psline(6,0)(.5,0)
        \closepath
    }
    \psaxes[ticks=none,labels=none]{->}(0,0)(-1,-1)(6.5,5.5)[$x$,0][$y$,90]
    \psplot[linecolor=blue]{0}{TwoPi}{\f}
    \psplot[linecolor=red]{0}{TwoPi}{\g}
\end{pspicture}
\end{document}

verwandte Informationen