我正在尝试使用 绘制累积二项分布函数tikz
。我已经创建了一个二项分布函数图,如下面的代码和图所示,但我需要该值在每次迭代时y
都增加前一个值。y
\j
下面的代码中有一行注释;我以为这会实现我想要的功能,但是它不起作用。
我知道我可以使用坐标列表来做我想做的事情,但我想要可以轻松调整的代码,因为最终我想要该参数的几个不同值\n
(最多\n=100
)。
提前致谢。
\documentclass{article}
\usepackage{pgfplots}
\pgfplotsset{compat=1.10}
\begin{document}
\begin{tikzpicture}[
declare function={binom(\j,\n,\p)=\n!/(\j!*(\n-\j)!)*\p^\j*(1-\p)^(\n-\j);} ]
\pgfmathsetmacro{\n}{10};
\pgfmathsetmacro{\p}{0.5};
\pgfmathsetmacro{\yup}{0};
\begin{axis}[ xlabel=state $j$, ylabel=cumul. dist. $F_{B(10,1/2)}$
,axis x line=middle
,axis y line=left
,xlabel near ticks
,domain=0:\n
];
\foreach \j in {0,...,\n} {
\addplot [color=red,domain=(\j-0.5):(\j+0.6)] {\yup+binom(floor(x+0.5),\n,\p)};
\pgfmathsetmacro{\yup}{0};
%\pgfmathsetmacro{\yup}{binom(\j,\n,\p)};
}
\end{axis}
\end{tikzpicture}
\end{document}
答案1
您需要将其分配给\yup
全局而不是本地。 \pgfmathsetmarco
不这样做。您必须使用\pgfmathparse
和\xdef\yup{\pgfmathresult}
来实现这一点。
\documentclass{article}
\usepackage{pgfplots}
\pgfplotsset{compat=1.10}
\begin{document}
\begin{tikzpicture}[
declare function={binom(\j,\n,\p)=\n!/(\j!*(\n-\j)!)*\p^\j*(1-\p)^(\n-\j);} ]
\pgfmathsetmacro{\n}{3};
\pgfmathsetmacro{\p}{0.5};
\pgfmathsetmacro{\yup}{0};
\begin{axis}[ xlabel=state $j$, ylabel=cumul. dist. $F_{B(10,1/2)}$
,axis x line=middle
,axis y line=left
,xlabel near ticks
,domain=0:\n
];
\foreach \j in {0,...,\n} {
\addplot [color=red,domain=(\j-0.5):(\j+0.5)] {\yup+binom(floor(x+0.5),\n,\p)};
\pgfmathparse{\yup+binom(\j,\n,\p)}
\xdef\yup{\pgfmathresult}
}
\end{axis}
\end{tikzpicture}
\end{document}
然而你会发现\n
快速增加会导致溢出。