丰富的系统发育树和非线性时间线

丰富的系统发育树和非线性时间线

我希望绘制一个图形丰富的系统发育树(边缘可能有几种颜色/样式),更重要的是,该树将与时间线对齐,而不必是线性的。

我能找到的最接近我所寻找的例子如下:

在此处输入图片描述

取自这里

右边的动物图片很漂亮,但我并不真正关心这些。彩色条也很漂亮,但同样,并不重要。这张图片中我想要的两个元素是虚线和时间线(这里实现为垂直白条,底部有标签)。由于标签似乎是自定义的,我可以将时间线设为“非线性”。我还发现控制动物标签的字体很有用(就像他们在图片中所做的那样)。

我最初认为 newicktree 包应该可以完成这项工作,但在阅读了它的文档后,我发现它似乎相当简单,可能无法完成这样的任务。下一个猜测是 tikz,但我对它的经验较少,而且它有相当多的包。你认为这些包中是否有适合这样的任务?

只是为了说明一下,我只对能够产生结果感兴趣,我不太关心所需的语法。例如,我不关心输入是否是经典的 Newick 树格式,正如建议的那样在这个问题中。我也可以接受使用非自动化过程来创建这样的树,因为我可能不需要多次执行此操作。

你有什么建议吗?

答案1

这是该包的一个简短示例forest。我制作了图表的下半部分。非常基础,没有颜色,但您可以根据自己的喜好进行更改。

输出

例子

代码

\documentclass[margin=10pt]{standalone}
\usepackage{forest}

\usetikzlibrary{positioning, backgrounds}

\tikzset{
    timeline/.style={text centered, text width=2cm},
     no edge from this parent/.style={
        every child/.append style={
        edge from parent/.style={draw=none}}},
}

\forestset{
    every leaf node/.style={
        if n children=0{#1}{}
    },
    every tree node/.style={
        if n children=0{}{#1}
    },
    mytree/.style={
        for tree={
            edge path={
            \noexpand\path [draw, thick, \forestoption{edge}] (!u.parent anchor) |- (.child anchor)\forestoption{edge label};
            },
            every tree node={draw=none,inner sep=0, outer sep=0, minimum size=0},
            every leaf node/.style={align=left},
            grow'=0,
            parent anchor=east, 
            child anchor=west,
            anchor=west,
            l sep=2cm,
            s sep=3mm,
            draw=none,
    if n children=0{tier=word}{}
        }
    }
}

\begin{document}
\begin{forest} mytree
[,phantom, name=lvl0
    [,name=lvl1
        [,edge=dashed,name=lvl2
            [gray fox ] 
            [island fox,edge=dashed ]
        ]
        [
            [,name=lvl3
                [black bear ]
                [giant panda ] 
            ]
            [
                [northern elephant seal ]
                [walrus ] 
            ] 
        ] 
    ]
]
%
\coordinate (tml) at (0,-3.5);
\begin{scope}[on background layer]
\foreach \age [count=\x starting from 1] in {
    {10 million years ago},
    {7.4 million years ago},
    {4 million years ago}
    }{
    \node[timeline] (age\x) at (tml-|lvl\x) {\age};
    \draw[gray] (age\x) --++ (0,6);
}
\end{scope}
\end{forest}
\end{document}

相关内容