我在 tikz 的帮助下在 beamer 框架中绘制了一些布朗运动(参见汤姆的代码)我想得到以下效果:
布朗运动被一个正整数截断,随着正整数的增加,呈现布朗运动的全景图。
我尝试使用一些白色矩形覆盖\onslide
投影仪中的布朗运动,并在矩形下方画一条线。但是当线上升时,布朗运动的轨迹会发生变化。因为当生成覆盖时,布朗运动将再次被绘制\onslide
。在每个覆盖中,轨迹都不同。这是我的 MWE:
\documentclass{beamer}
\useoutertheme{infolines}
\usetheme{Darmstadt}
\usepackage{tikz}
\begin{document}
\begin{frame}{Brownian motions}
\begin{tikzpicture}[scale=0.6]
\draw[help lines] (0,0) grid (15,10);
\draw[red] (0,0)
\foreach \x in {1,2,...,750}
{ -- ++(0.02,rand*0.2+0.01) };
\draw[blue] (0,0)
\foreach \x in {1,2,...,750}
{ -- ++(0.02,rand*0.2+0.01) };
\draw[green] (0,0)
\foreach \x in {1,2,...,750}
{ -- ++(0.02,rand*0.2+0.01) };
\draw[orange] (0,0)
\foreach \x in {1,2,...,750}
{ -- ++(0.02,rand*0.2+0.01) };
\foreach \i in {1,2,...,7}
{
\onslide<\i>{
\draw[thick,red] (0,\i+3) -- ++(15,0);
\draw[white,fill=white,very thin] (0,\i+3) rectangle (15,11);
\draw[help lines] (0,\i+3) grid (15,10);
}
}
\draw[thick,->,>=stealth] (0,0) -- (16,0) node[right] {$t$};
\draw[thick,->,>=stealth] (0,0) -- (0,11) node[above] {$Y_t$};
\end{tikzpicture}
\end{frame}
\end{document}
请参阅以下屏幕截图:
所以我想如果我能修复轨迹,我想要的效果就很容易获得了。
我也尝试使用以下方法:
首先,在另一个文档中绘制轨迹;然后使用“\includegraphics”将轨迹作为单个 pdf 使用。
但我还想删除红色、橙色和绿色轨迹,并在最后的叠加层中保留蓝色轨迹。然后修复轨迹对于删除轨迹也很重要。
我怎样才能得到上面提到的效果?我非常感谢你的工作。
答案1
首先说几点:
- 如果只有开始和结束通过点连接,则循环
\foreach
假设元素之间相差一,因此\foreach \x in {1,2,...,100}
将产生与\foreach \x in {1,...,100}
- 你把 RONI(不感兴趣的区域)涂成白色。最好是
\clip
ROI(感兴趣的区域) - 在图片中使用
beamer
命令TikZ
似乎不能正常工作,所以我使用\only<n>
规范在不同的幻灯片上显示整个图片 - 虽然你和我可能会认为
{1,...,7}
这些数字应该是整数,但计算机不一定如此,这就是为什么我将外部 for 循环变量 (\f
) 转换为整数 (\i
),方法是\pgfmathtruncatemacro
- 用于
\scope
保持剪辑局部
结果如下:
\documentclass{beamer}
\useoutertheme{infolines}
\usetheme{Darmstadt}
\usepackage{tikz}
\begin{document}
\begin{frame}{Brownian motions}
\foreach \f in {1,...,7}
{ \pgfmathtruncatemacro{\i}{\f}
\only<\i>{\begin{tikzpicture}[scale=0.55]
\draw[help lines] (0,0) grid (15,10);
\begin{scope}
\clip (0,0) rectangle (15,\i+3);
\draw[red] (0,0)
\foreach \x in {1,...,750}
{ -- ++(0.02,rand*0.2+0.01) };
\draw[blue] (0,0)
\foreach \x in {1,...,750}
{ -- ++(0.02,rand*0.2+0.01) };
\draw[green] (0,0)
\foreach \x in {1,...,750}
{ -- ++(0.02,rand*0.2+0.01) };
\draw[orange] (0,0)
\foreach \x in {1,...,750}
{ -- ++(0.02,rand*0.2+0.01) };
\end{scope}
\draw[thick,red] (0,\i+3) -- ++(15,0);
\draw[thick,->,>=stealth] (0,0) -- (16,0) node[right] {$t$};
\draw[thick,->,>=stealth] (0,0) -- (0,11) node[above] {$Y_t$};
\end{tikzpicture}}
}
\end{frame}
\end{document}
要将某些图表仅放在某些幻灯片上,您可以使用包\ifthenelse{condition}{true path}{false path}
中的命令xifthen
:
\documentclass{beamer}
\useoutertheme{infolines}
\usetheme{Darmstadt}
\usepackage{tikz}
\usepackage{xifthen}
\begin{document}
\begin{frame}%{Brownian motions}
\foreach \f in {1,...,7}
{ \pgfmathtruncatemacro{\i}{\f}
\only<\i>{
\begin{tikzpicture}[scale=0.55]
\draw[help lines] (0,0) grid (15,10);
\begin{scope}
\clip (0,0) rectangle (15,\i+3);
\draw[blue] (0,0)
\foreach \x in {1,...,750}
{ -- ++(0.02,rand*0.2+0.01) };
\ifthenelse{\i<7}
{ \draw[red] (0,0)
\foreach \x in {1,...,750}
{ -- ++(0.02,rand*0.2+0.01) };
\draw[green] (0,0)
\foreach \x in {1,...,750}
{ -- ++(0.02,rand*0.2+0.01) };
\draw[orange] (0,0)
\foreach \x in {1,...,750}
{ -- ++(0.02,rand*0.2+0.01) };
}{}
\end{scope}
\draw[thick,red] (0,\i+3) -- ++(15,0);
\draw[thick,->,>=stealth] (0,0) -- (16,0) node[right] {$t$};
\draw[thick,->,>=stealth] (0,0) -- (0,11) node[above] {$Y_t$};
\end{tikzpicture}
}
}
\end{frame}
\end{document}
答案2
杰克的和汤姆的回答如何在 tikz/pgf 中绘制布朗运动展示如何使用 TiKZ 和 pgfplots 绘制伪随机图,这里 Jake 建议使用,\pgfmathsetsed
以便在不同的幻灯片中绘制相同的随机路径。我建议使用下一个代码(只是改编自杰克的解决方案)是将所有路径保存到一个文件中,然后根据需要读取它们。这样,每次处理文档时就不必重复所有计算。
软件包提供了将表()保存到磁盘文件( )的pgfplotstable
命令。\pgfplotstablesave{\loadedtable}{brownian.dat}
\loadedtable
brownian.dat
该文件将在您第一次处理文档brownian.dat
时创建,但通过测试帮助,在后续编译中可以避免所有这些耗时的过程。\pgfplotstablenew
\IfFileExists
正如解释的那样是否可以在 pgfplots 图形内的 beamer 中创建覆盖?,您可以使用\only<>
并\addplot
在每张幻灯片上绘制一条或多条曲线。问题是为每张幻灯片pgfplots
计算一个新axis
环境,因此有必要为所有幻灯片固定轴尺寸(ymin=-1.5, ymax=2.5
在本例中),否则 ymin 和 ymax 将适应特定幻灯片,并且它们将从一张幻灯片跳到另一张幻灯片。
如果您希望在每张幻灯片中为每条路径显示相同的颜色,则绘制颜色也需要固定。\addplot[color] table ...
这就是您所需要的。
这是代码
\documentclass{beamer}
\usepackage{pgfplots, pgfplotstable}
\IfFileExists{brownian.dat}{}{
\pgfmathsetseed{3}
\pgfplotstablenew[
create on use/brown1/.style={
create col/expr accum={\pgfmathaccuma + 0.1*rand}{0}
},
create on use/brown2/.style={
create col/expr accum={\pgfmathaccuma + 0.1*rand}{0}
},
create on use/brown3/.style={
create col/expr accum={\pgfmathaccuma + 0.1*rand}{0}
},
columns={brown1,brown2,brown3}
]
{700}
\loadedtable
\pgfplotstablesave{\loadedtable}{brownian.dat}
}
\begin{document}
\begin{frame}{Brownian}
{\par\centering
\begin{tikzpicture}
\begin{axis}[
line join=bevel,
no markers,
table/x expr={\coordindex/400},
xmin=0,
enlarge x limits=false,
ymin=-1.5,
ymax=2.5,
]
\only<1-4>{\addplot[red] table [y expr={max(\thisrow{brown1},-0.7)}] {brownian.dat};}
\only<2,3>{\addplot[green] table [y expr={min(\thisrow{brown2},2.2)}] {brownian.dat};}
\only<3-4>{\addplot[blue] table [y expr=\thisrow{brown3}] {brownian.dat};}
\draw (axis cs:0.4,2.2) -- ({axis cs:0.4,2.2}-|{rel axis cs:1,0})
(axis cs:1.3,-0.7) -- ({axis cs:1.3,-0.7}-|{rel axis cs:1,0});
\end{axis}
\end{tikzpicture}\par}
\end{frame}
\end{document}
这就是结果