这本质上是同一个问题当已知两条曲线的坐标时,填充它们之间的区域。
在那个问题中,曲线是由已知坐标定义的。我想填充两条曲线之间的区域,但我希望曲线是根据 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}