我需要创建这个图表(尝试以通用方式编写它,我使用的是 Python):
f(x) = sum([x*a>1 for a in gaussian(...)]) % some normal distribution
我尝试使用的是这个:
\pgfmathdeclarefunction{gaussian}{2}{\pgfmathparse{1/(#2*sqrt(2*pi))*exp(-((x-#1)^2)/(2*#2^2))}%
}
\pgfmathdeclarefunction{gsum}{2}{%
\pgfmathsetmacro\ret{0}%
\foreach \i in {#1}{%
\pgfmathsetmacro\ret{\ret+(\i*#2>1?1:0)}%
\xdef\ret{\ret}%
}%
\pgfmathparse{\ret}%
}
...
\addplot [
domain=0:1.5,
samples=100,
color=red,
]
{gsum(gaussian(0.75,0.25), x)};
我希望从 Python 获得什么:
我得到的是:
非常感谢您的帮助,我已经找了好几个小时也没找到解决方案,可能是因为我几天前才开始使用它。
答案1
现在,我不知道您到底想要什么功能,所以我绘制了几个。
您的问题是,您\pgfmathsetmacro\ret{0}
在函数中使用了。\ret
每次调用时都会重置,因此不会进行任何总结。将初始化移到前面\addplot
可以解决您的问题。
代码:
\documentclass[border=2mm]{standalone}
\usepackage{pgfplots}
\pgfmathdeclarefunction{gaussian}{2}{%
\pgfmathparse{1/(#2*sqrt(2*pi))*exp(-((x-#1)^2)/(2*#2^2))}%
}
\pgfmathdeclarefunction{gsum}{2}{%
%\pgfmathsetmacro\ret{0}% bad here, because it resets \ret every time
\foreach \i in {#1}{%
\pgfmathsetmacro\ret{\ret+(\i*#2>1?1:0)}%
\xdef\ret{\ret}%
}%
\pgfmathparse{\ret}%
}
\pgfmathdeclarefunction{gsuma}{2}{%
\foreach \i in {#1}{%
\pgfmathsetmacro\ret{\ret+(\i*#2)}%
\xdef\ret{\ret}%
}%
\pgfmathparse{\ret}%
}
\pgfmathdeclarefunction{gsumb}{2}{%
\foreach \i in {#1}{%
\pgfmathsetmacro\ret{\ret+(\i)}%
\xdef\ret{\ret}%
}%
\pgfmathparse{\ret}%
}
\begin{document}
\begin{tikzpicture}
\begin{axis}[xlabel=$x$,ylabel=$f(x)$]
% initialise \ret
\pgfmathsetmacro\ret{0}%
\addplot [
domain=0:1.5,
samples=100,
color=red,
]
{gsum(gaussian(0.75,0.25), x)};
% initialise \ret again
\pgfmathsetmacro\ret{0}%
\addplot [
domain=0:1.5,
samples=100,
color=cyan,
]
{gsuma(gaussian(0.75,0.25), x)};
% and initialise \ret yet again
\pgfmathsetmacro\ret{0}%
\addplot [
domain=0:1.5,
samples=100,
color=green,
]
{gsumb(gaussian(0.75,0.25), x)};
% just to see the gaussian function
\addplot [
domain=0:1.5,
samples=100,
color=blue,
]
{10*gaussian(0.75,0.25)};
\end{axis}
\end{tikzpicture}
\end{document}
结果: