
Estou carregando duas curvas de um arquivo e plotando-as com \addplot table [...] {the table.txt};
consegui preencher a área sob uma única curva, mas quero o mínimo das duas curvas preenchidas. Qual é a maneira preferida de fazer isso usando tikz e pgfplots? A imagem mostra um exemplo do resultado desejado.
Obrigado por qualquer ajuda.
Responder1
Isso pode ser feito pela fillbetween
biblioteca que acompanha pgfplots
a versão 1.10:
\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}
A ideia é usar as novas intersection segments
instruções de caminho fornecidas pelo fillbetween
. Ele aceita caminhos rotulados na entrada e sequence
em segmentos de interseção. Atualmente, o “mínimo” precisa ser fornecido manualmente. No seu caso, você precisa usar o primeiro (0º) segmento da primeira (A) curva ( A0
), depois o segundo (1º) da segunda curva (B) que é B1
, seguido pelo terceiro (2º) segmento do primeira curva que é A2
. As outras declarações especificam a linha inferior da região preenchida. As instruções de estratificação set layers
e \pgfonlayer
certifique-se de que o material apareça atrás dos caminhos de entrada rotulados.
Observe que a versão 1.10 é muito recente no momento em que este livro foi escrito - você pode precisar de uma atualização de software.
Responder2
Outra alternativa é a utilização do clip
duplo, sem fillbetween
biblioteca. Primeiro, preencha a área abaixo da curva seno e depois limpe a área acima da curva cosseno.
Código:
\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}
Responder3
Apenas para finalizar a questão com o PSTricks.
Representação pós-fixada
\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}
Representação infixa
Se você preferir trabalhar no infix, use o seguinte.
\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}