介绍
我正在尝试制作一个图表来说明 Wright-Fisher 模型中的多代种群。在这个种群中,各代人不重叠,每代都有相同数量的个体,每个个体都有两个选定的父母随机来自上一代。这通常用图表上的节点来表示,每一代都在同一条水平线上,节点之间的链接象征着个体之间的遗传,如下所示:
(来源:文化数学网)
问题
我已经有一个可以运行的代码来生成代表多代个体的节点,但我找不到让每个节点随机选择前一行中两个节点(对应于上一代)的方法。我这样做的理由是让每个节点位于一代的 x 位置,y 固定:
(\x\yi)
画他的父母从上一代/行节点中随机选取对应于 yi+1 的一个数字,生成一个 0 到 9 之间的数字:
(\pgfmathparse{random(10)}\pgfmathresult-1 , \yi+1)
我的代码
这是我目前拥有的代码:
\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage{tikz}
\usepackage{pifont}
\usetikzlibrary{shapes}
\usetikzlibrary{calc}
\usetikzlibrary{positioning}
\usetikzlibrary{decorations.pathreplacing}
\usepackage{amsmath,amssymb,enumitem}
\usepackage{lcg,calc}
\usepackage{amsmath}
\usepackage{enumitem}
\begin{document}
\fontfamily{phv}
\begin{tikzpicture}[darkstyle/.style={circle,draw,fill=red!40,minimum size=20}]
\foreach \x in {0,...,9}
\foreach \y in {0,...,9}
\node [darkstyle] (\x\y) at (1.5*\x,1.5*\y) {};
\foreach \y [count=\yi] in {0,...,9}
\foreach \x [count=\xi] in {0,...,9}
\draw (\x\yi)--(\pgfmathparse{random(10)}\pgfmathresult-1\yi+1) (\x\yi)--(\pgfmathparse{random(10)}\pgfmathresult-1\yi+1);
\end{tikzpicture}
\end{document}
结果
编译上述内容后,我从 sharelatex.com 获得以下错误消息:
Incomplete \iffalse; all text was ignored after line 29.
<inserted text>
\fi
<*> main.tex
The file ended while I was skipping conditional text.
This kind of error happens when you say `\if...' and forget
the matching `\fi'. I've inserted a `\fi'; this might work.
! Emergency stop.
<*> main.tex
*** (job aborted, no legal \end found)
也许乳胶中的节点标签需要的是文本格式,而不是生成的数字\pgfmathparse
。
感谢您对此提供的任何帮助。
答案1
节点名称可以是宏,但它必须扩展为节点名称。但是,\pgfmathparse
是不可扩展的,这会导致这个相当神秘的错误。您可以\pgfmathparse
在使用 评估坐标之前执行此操作\pgfextra
。
count
对于连续整数列表中的条目来说,这也没有什么意义。我将其替换为使用 的解决方案remember
。
仅包含数字的节点名称可能会造成破坏,尤其是涉及小数时。为了给您提供至少某种保护,我在所有节点上都添加了前缀n
。
\documentclass{article}
\usepackage{tikz}
\begin{document}
\begin{tikzpicture}[darkstyle/.style={circle,draw,fill=red!40,minimum size=20}]
\foreach \x in {0,...,9}
\foreach \y in {0,...,9}
\node [darkstyle] (n\x\y) at (1.5*\x,1.5*\y) {};
% Set the seed for deterministic random connections
\pgfmathsetseed{42}
\foreach \y [remember=\y as \lasty (initially 0)] in {1,...,9}
\foreach \x in {0,...,9} {
\draw (n\x\lasty) \pgfextra{\pgfmathparse{random(0,9)}} -- (n\pgfmathresult\y);
\draw (n\x\lasty) \pgfextra{\pgfmathparse{random(0,9)}} -- (n\pgfmathresult\y);
}
\end{tikzpicture}
\end{document}