
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.
Antwort1
Dies kann mithilfe der Bibliothek erfolgen , die mit der Version 1.10 fillbetween
ausgeliefert wird :pgfplots
\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 segments
Die Idee ist, die neuen Pfadanweisungen von zu verwenden fillbetween
. Sie akzeptiert zwei beschriftete Pfade als Eingabe und eine Anzahl sequence
von 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 layers
und \pgfonlayer
stellen 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
clip
Eine weitere Alternative ist die zweimalige Verwendung ohne fillbetween
Bibliothek. Füllen Sie zuerst den Bereich unter der Sinuskurve und bereinigen Sie dann den Bereich über der Cosinuskurve.
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}
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}