tikz と pgfplots を使用して、少なくとも 2 つの関数の下の領域を塗りつぶします。

tikz と pgfplots を使用して、少なくとも 2 つの関数の下の領域を塗りつぶします。

ファイルから 2 つの曲線をロードしてプロットしています。1\addplot table [...] {the table.txt};つの曲線の下の領域を塗りつぶすことはできましたが、2 つの曲線のうちの最小の部分を塗りつぶしたいです。tikz と pgfplots を使用してこれを実現するには、どのような方法が最適ですか? 画像は、望ましい結果の例を示しています。

ご協力いただきありがとうございます。

ここに画像の説明を入力してください

答え1

これはバージョン 1.10fillbetweenに同梱されているライブラリによって実行できます。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によって提供される新しいパス命令を使用することですfillbetween。 は、入力に 個のラベル付きパスとsequence個の交差セグメントを受け入れます。 現在、「最小値」は手動で提供する必要があります。 この場合、最初の (A) 曲線 ( A0) の最初の (0 番目の) セグメントを使用し、次に 2 番目の曲線 (B) の 2 番目の (1 番目の) セグメントである を使用しB1、続いて最初の曲線の 3 番目の (2 番目の) セグメントである を使用する必要がありますA2。 その他のステートメントは、塗りつぶされた領域の一番下の線を指定します。 レイヤー化命令とset layersは、\pgfonlayerラベル付き入力パスの背後に要素が表示されるようにします。

この記事の執筆時点ではバージョン 1.10 はまだ新しいため、ソフトウェアのアップグレードが必要になる可能性があることに注意してください。

答え2

clipもう 1 つの方法は、ライブラリを使用せずに 2 回使用することですfillbetween。最初に、正弦曲線の下の領域を塗りつぶし、次に余弦曲線の上の領域をクリーンアップします。

ここに画像の説明を入力してください

コード:

\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}

答え3

PSTricks で質問を最終決定するためです。

接尾辞表現

\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}

ここに画像の説明を入力してください

中置表現

中置で作業したい場合は、以下を使用します。

\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}

関連情報