如何使用大型数据集绘制树状图?

27

我正在使用R中的ape(系统发育和演化分析)软件包,其中包含绘制树状图的功能。我使用以下命令以Newick格式读取数据,并使用plot函数绘制树状图:

library("ape")
gcPhylo <-read.tree(file = "gc.tree")
plot(gcPhylo, show.node.label = TRUE)

由于数据集非常庞大,因此在树的较低层中无法看到任何细节。我只能看到黑色区域,但没有细节,只能从顶部看到少数几层,然后就没有细节了。

我想知道是否有绘图函数的缩放功能。我尝试使用xLim和yLim限制区域,但它们只是限制了区域,而没有进行缩放以使细节可见。缩放或在不进行缩放的情况下使细节可见都可以解决我的问题。

我也很感谢了解任何其他软件包、函数或工具,可以帮助我解决这个问题。

谢谢。


你在 r-sig-phylo@r-project.org 邮件列表中可能会更成功地得到答案,那里是使用 R 进行系统发育分析的专家聚集的地方。你看过 ape 包中的 ?zoom 吗? - Ben Bolker
感谢您提供邮件列表建议。如果我无法通过已经给出的答案解决问题,我会提出问题。我尝试了ape中的缩放功能,但较低的节点仍然不清晰。我还将尝试在搜索ape缩放时遇到的subtreeplot()函数。 - Burcu
2个回答

49

可以在指定高度上“剪切”谱系图并绘制元素:

首先使用内置数据集USArrests创建一个聚类。然后将其转换为dendrogram

hc <- hclust(dist(USArrests))
hcd <- as.dendrogram(hc)

接下来,使用cut.dendrogram在指定的高度处进行切割,此处为h=75。这将产生一个包含upper位切割的树状图列表,以及每个branch下方的一个树状图列表:

par(mfrow=c(3,1))

plot(hcd, main="Main")
plot(cut(hcd, h=75)$upper, 
     main="Upper tree of cut at h=75")
plot(cut(hcd, h=75)$lower[[2]], 
     main="Second branch of lower tree with cut at h=75")

输入图像描述


是的,太棒了!那会解决我的问题。但是,是否可以将系统发育树转换为树状图?我拥有的只是一棵树,这是我的java程序的输出。因此,是否可以根据我的输出定义一个树状图,而不是使用hclust对象? 抱歉,这是我与R的第一次交互。 - Burcu
5
当然是可能的:您只需要在read.tree的输出上调用as.hclust(它是一个R类为phylo的对象)以将其转换为hclust类的对象。 - MatthewS
2
有没有可能在特定数量的聚类处切断树状图,而不是在特定高度处?我无法弄清楚如何绘制包含10个聚类的树状图。 - skurp
@skurp 是的,你可以! cut <- cutree(hc, k = 10); plot(hc, hang = -1); rect.hclust(hc, k = 10) - RDRR

30

在其他答案中描述的cut函数是一个非常好的解决方案;如果您想要在一个页面上维护整个树进行交互式调查,您也可以将其绘制到PDF的大页面上。

生成的PDF是矢量化的,因此您可以使用您喜爱的PDF查看器进行近距离缩放而不会失去分辨率。

这里是如何将绘图输出直接导向PDF的示例:

# Open a PDF for plotting; units are inches by default
pdf("/path/to/a/pdf/file.pdf", width=40, height=15)

# Do some plotting
plot(gcPhylo)

# Close the PDF file's associated graphics device (necessary to finalize the output)
dev.off()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接