![如何用 PGFPlots 绘制模糊曲线?](https://linux22.com/image/277500/%E5%A6%82%E4%BD%95%E7%94%A8%20PGFPlots%20%E7%BB%98%E5%88%B6%E6%A8%A1%E7%B3%8A%E6%9B%B2%E7%BA%BF%EF%BC%9F.png)
我正在尝试使用 PGFPlots 复制以下图表:
在这个答案,作者在绘制重叠椭圆时使用了不透明度。是否可以使用类似的代码绘制任意曲线?
理想情况下,应该为每个横坐标指定置信区间。
您对用于生成上述图表的软件有什么提示吗?或者有其他建议吗(Matplotlib、R 等)?
答案1
这基本上与是否有一种简单的方法可以使用线条粗细作为绘图中的错误指示器?,仅使用函数而不是表格数据。诀窍是stack plots=y
一起使用来\closedcycle
创建带区。
我定义了一个新命令,\addplotwitherrorbands[<optional styles>]{<function>}{<positive error>}{<negative error>}
可以按如下方式使用:
\documentclass[border=5mm]{standalone}
\usepackage{pgfplots}
\begin{document}
\tikzset{
error band/.style={fill=orange},
error band style/.style={
error band/.append style=#1
}
}
\newcommand{\addplotwitherrorband}[4][]{
\addplot [#1, draw=none, stack plots=y, forget plot] {#2-(#3)};
\addplot +[#1, draw=none, stack plots=y, error band] {(#3)+(#4)} \closedcycle;
\addplot [#1, draw=none, stack plots=y, forget plot] {-(#2)-(#3)};
\addplot [#1, forget plot] {#2};
}
\begin{tikzpicture}[
declare function={f(\x)=rad(\x)-sin(\x);}
]
\begin{axis}[domain=0:360, enlarge x limits=false,
cycle list={
error band style=orange!20\\
error band style=orange!40\\
error band style=orange!60\\
error band style=orange!80\\
error band style=orange!100\\
}]
\pgfplotsinvokeforeach{1,0.5,0.25,0.125, 0.0625} {
\addplotwitherrorband [] {f(x)}{#1}{#1}
}
\end{axis}
\end{tikzpicture}
\end{document}
答案2
检查这个是否MWE
符合Asymptote
您的需要。为了演示,本例中使用了三条路径(guide
s)
gtop
,gbot
并gmid
定义f(x)
平均值和s(x)
偏差的函数,使用f(x)
和的正确定义s(x)
。数组pen[] clrs
定义颜色,数组real[] dh
定义总间隔的分数以覆盖相应的颜色。然后,对于每种颜色,定义顶部(gt
)、底部( )参考线并将其连接到用第一种颜色填充的gb
区域中。g
i
% blurred.tex:
%
\documentclass{article}
\usepackage{textgreek}
\usepackage[inline]{asymptote}
\usepackage{lmodern}
\begin{document}
\begin{figure}
\begin{asy}
size(200);
import graph;
pair[] botP={(0,0.09),(0.252,0.196),(0.383,0.429),(0.479,0.588),
(0.574,0.668),(0.733,0.726),(0.883,0.747),(1,0.747),};
pair[] topP={(0,0.341),(0.252,0.451),(0.383,0.677),(0.479,0.841),
(0.574,0.92),(0.733,0.977),(0.883,0.993),(1,1),};
pair[] midP=0.5*(topP+botP);
guide gtop=graph(topP,operator..);
guide gbot=graph(botP,operator..);
guide gmid=graph(midP,operator..);
real f(real x){
real t=times(gmid,x)[0];
return point(gmid,t).y;
};
real s(real x){
real tt=times(gtop,x)[0];
real tb=times(gbot,x)[0];
return point(gtop,tt).y-point(gbot,tb).y;
};
real xmin=0, xmax=1;
pen[] clrs={
rgb(0.988,0.847,0.796),
rgb(0.969,0.592,0.502),
rgb(0.953,0.365,0.29),
rgb(0.933,0.188,0.165),
rgb(0.933,0.114,0.137),
};
real[] dh={1,0.5,0.25,0.125,0.0625};
guide gt, gb,g;
for(int i=0;i<clrs.length;++i){
gt=graph(new real(real x){return f(x)+0.5dh[i]*s(x);},xmin,xmax);
gb=graph(new real(real x){return f(x)-0.5dh[i]*s(x);},xmin,xmax);
g=gb--reverse(gt)--cycle;
fill(g,clrs[i]);
}
real ymax=1.1;
pen axisPen=darkblue+1.3bp;
xaxis(xmin,xmax,axisPen);
xaxis(YEquals(ymax),xmin,xmax,axisPen);
label("\textbf{\straighttheta(d$|$m)}",(0.6,0.5));
label("\textbf{m}",(xmax,0),NW);
label("\textbf{d}",(0,1),SE);
shipout(bbox(Fill(paleyellow)));
\end{asy}
\end{figure}
\end{document}
%
% Process:
%
% pdflatex blurred.tex
% asy blurred-*.asy
% pdflatex blurred.tex
答案3
灵感来自g.kov 答案,这是 TikZ 解决方案:
\usetikzlibrary{backgrounds}
\begin{tikzpicture}[
show background rectangle,
declare function={
f(\x) = \x - sin(deg(\x));
s(\x) = 0.8;
xmin = 0;
xmax = 2*pi;
}]
\foreach \dh/\color in {1/20, 0.5/40, 0.25/60, 0.125/80, 0.0625/100} {
\fill[smooth,color=red!\color,domain=xmin:xmax] plot (\x,{f(\x)+\dh*s(\x)}) --
plot[domain=xmax:xmin] (\x,{f(\x)-\dh*s(\x)}) -- cycle;
}
\node at (current bounding box.south east) {$m$};
\node at (current bounding box.north west) {$d$};
\end{tikzpicture}
不幸的是,PGFPlots 不允许像我使用 TikZ命令那样循环f(x)+s(x)
和f(x)-s(x)
使用。欢迎改进。\addplot
\draw
答案4
推荐使用 PSTricks 的解决方案。
\documentclass[pstricks,border=12pt]{standalone}
\usepackage{pst-plot}
\def\f(#1,#2){#1-sin(#1)+.8*(#2)}
\psset{algebraic,fillstyle=solid}
\begin{document}
\begin{pspicture}(-1,-1)(8,8)
\foreach \dh/\color in {1/20, 0.5/40, 0.25/60, 0.125/80, 0.0625/100}
{
\pscustom[fillcolor=red!\color,linestyle=none]
{
\psplot{0}{Pi 2 mul}{\f(x,\dh)}
\psplot{Pi 2 mul}{0}{\f(x,-\dh)}
\closepath
}
}
\psaxes{->}(0,0)(-1,-1)(7.5,7.5)[$x$,0][$y$,90]
\rput[tl](-1,8){$d$}
\rput[br](8,-1){$m$}
\end{pspicture}
\end{document}