随机选择 tikz-pgf 中的预先存在的节点

随机选择 tikz-pgf 中的预先存在的节点

介绍

我正在尝试制作一个图表来说明 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}

在此处输入图片描述

相关内容