填充 pgfplots 计算的两条曲线之间的区域

填充 pgfplots 计算的两条曲线之间的区域

这本质上是同一个问题当已知两条曲线的坐标时,填充它们之间的区域。

在那个问题中,曲线是由已知坐标定义的。我想填充两条曲线之间的区域,但我希望曲线是根据 pgfplots(或 gnuplot)计算出来的。

假设曲线由以下函数定义:

f(x) = sqrt(x)

g(x) = sqrt(x/2)

答案1

pgfplots 1.10 版刚刚发布,它为填充图表之间区域的问题提供了新的解决方案。

请注意,旧解决方案仍然可行且有效;此处仅提供可能简化任务的更新。为了使本网站的知识库保持最新,我fillbetween在此提供基于新库的解决方案:

在此处输入图片描述

\documentclass{standalone}
\usepackage{tikz,pgfplots}

\pgfplotsset{compat=1.10}
\usepgfplotslibrary{fillbetween}

\begin{document} 
\begin{tikzpicture}
    \begin{axis}[thick,smooth,no markers]
        \addplot+[name path=A,black] {sqrt(x)};
        \addplot+[name path=B,black] {sqrt(x/2)};

        \addplot[blue!50] fill between[of=A and B];
    \end{axis}
\end{tikzpicture}
\end{document}

解决方案取决于\usepgfplotslibrary{fillbetween}激活语法\addplot fill between[of=<first> and <second>]。填充区域的样式在选项列表中照常给出,它是blue!50。请注意,该fill between段将自动绘制在单独的图层上,即它位于主路径后面。

答案2

您可以(滥用)使用stack plots。只需从第二个函数中减去第一个函数即可撤消堆叠。

\documentclass{article}
\usepackage{tikz,pgfplots}

\begin{document} 
\begin{tikzpicture}
    \begin{axis}[stack plots=y,thick,smooth,no markers]
        \addplot+[black]              gnuplot{sin(x)};
        \addplot+[black,fill=blue!50] gnuplot{cos(x)-sin(x)} 
          \closedcycle;
    \end{axis}
\end{tikzpicture}
\end{document}

结果

为了获得更好的效果,您可能应该分别绘制填充和曲线:

\begin{axis}[stack plots=y,thick,smooth,no markers]
    \addplot+[black]                  gnuplot{sin(x)};         % sin
    \addplot+[black]                  gnuplot{cos(x)-sin(x)};  % cos
    \addplot[fill=blue!50,draw=none]  gnuplot{sin(x)-cos(x)}   % fill to sin
       \closedcycle;
\end{axis}

答案3

结果:

在此处输入图片描述

代码如下。我假设您同意将横轴定义为间隔内均匀分布的点集。我使用 pgfplotstable 以数学表达式的形式定义表格元素,然后使用这些表格定义路径,就像您在链接问题中看到的那样。

\documentclass{article}
\usepackage{pgfplots}
\usepackage{pgfplotstable}
\begin{document}

% Make two tables for the data -- use the same column names for each
\pgfplotstablenew[
  create on use/x/.style={create col/expr={.5+\pgfplotstablerow*0.05}},
  create on use/y/.style={create col/expr={sqrt(\thisrow{x}}},
  columns={x,y}]
  {21}
  \ftable
%\pgfplotstabletypeset\ftable
\pgfplotstablenew[
  create on use/x/.style={create col/expr={.5+\pgfplotstablerow*0.05}},
  create on use/y/.style={create col/expr={sqrt(\thisrow{x}/2)}},
  columns={x,y}]
  {21}
  \gtable
%\pgfplotstabletypeset\gtable
% Sort the second table by the x value, from largest to smallest
\pgfplotstablesort[sort cmp={float >}]\gsorted{\gtable}
%\pgfplotstabletypeset\gsorted
% Concatenate the tables -- now filledcurve contains the edge of
% a polygon bounded by curves f and g
\pgfplotstablevertcat{\filledcurve}{\ftable}
\pgfplotstablevertcat{\filledcurve}{\gsorted}
% Draw the curves and the polygon
\begin{tikzpicture}
\begin{axis}
\addplot[fill=gray!40,draw=none] table {\filledcurve};
\addplot[red] table {\ftable};
\addplot[blue] table {\gtable};
\end{axis}
\end{tikzpicture}

\end{document}

答案4

\documentclass[11pt]{article}
\usepackage{pst-plot}

\begin{document}

\begin{psgraph}{->}(0,0)(5,2.5){6cm}{5cm}
\pscustom[fillstyle=solid,fillcolor=black!20,
          linestyle=none]{
  \psplot[algebraic]{1}{4}{sqrt(x)}
  \psplot[algebraic]{4}{1}{sqrt(x/2)} }
\psplot[algebraic,linecolor=red,linewidth=1pt]{1}{4}{sqrt(x)}
\psplot[algebraic,linecolor=blue,linewidth=1pt]{4}{1}{sqrt(x/2)}
\end{psgraph}

\end{document}

在此处输入图片描述

相关内容