我希望绘制一个图形丰富的系统发育树(边缘可能有几种颜色/样式),更重要的是,该树将与时间线对齐,而不必是线性的。
我能找到的最接近我所寻找的例子如下:
取自这里。
右边的动物图片很漂亮,但我并不真正关心这些。彩色条也很漂亮,但同样,并不重要。这张图片中我想要的两个元素是虚线和时间线(这里实现为垂直白条,底部有标签)。由于标签似乎是自定义的,我可以将时间线设为“非线性”。我还发现控制动物标签的字体很有用(就像他们在图片中所做的那样狗)。
我最初认为 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}