
Я загружаю две кривые из файла и строю их с помощью \addplot table [...] {the table.txt};
Мне удалось заполнить область под одной кривой, но я хочу, чтобы была заполнена минимальная из двух кривых. Какой предпочтительный способ сделать это с помощью tikz и pgfplots? На изображении показан пример желаемого результата.
Спасибо за любую помощь.
решение1
Это можно сделать с помощью fillbetween
библиотеки, которая поставляется с pgfplots
версией 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}
Идея заключается в использовании новых intersection segments
инструкций пути, предоставляемых fillbetween
. Он принимает помеченные пути на входе и sequence
сегменты пересечения. В настоящее время «минимум» необходимо указывать вручную. В вашем случае вам нужно использовать первый (0-й) сегмент первой (A) кривой ( A0
), затем второй (1-й) сегмент второй кривой (B), который является B1
, а затем третий (2-й) сегмент первой кривой, который является A2
. Другие операторы указывают нижнюю линию заполненной области. Инструкции по наложению слоев set layers
и \pgfonlayer
убедитесь, что материал появляется за помеченными входными путями.
Обратите внимание, что версия 1.10 на момент написания статьи еще очень новая — возможно, вам потребуется обновление программного обеспечения.
решение2
Другой альтернативой является использование clip
twice, без 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}