在R中,如何将data.tree图保存到文件中?

时间:2017-02-08 08:29:51

标签: r image plot tree save

我无法在plot.Node中保存由data.tree函数生成的绘图。我尝试了以下内容:

### Create tree object and plot it
data(acme);
plot(acme);

这样可以正常工作,如人们所期望的那样显示情节。

### Try saving it as png
png(filename='file.png', type='cairo-png');
plot(acme);
dev.off();

这会创建一个空文件。 ggsave也是如此。显然,plot.Node使用了DiagrammeR,所以我调查了那个包。它具有导出图形的功能:

export_graph(acme, file_name="file.png");

这给出了错误:

Error in file.exists(diagram) : invalid 'file' argument

当我首先转换为GraphViz时,我得到一个不同的错误:

export_graph(ToGraphViz(acme), file_name="file.png");

Error in graph$dot_code : $ operator is invalid for atomic vectors

显然,导出到GraphViz并不能完全导出到DiagrammeR期望的内容。

我在RStudio,理论上可以使用GUI保存图表,但我需要在脚本中使用它。

显然,plot.Node实际上并没有绘制任何东西 - 相反它似乎生成了html / js。这是否意味着该结果无法存储为图形?或者某些导出/转换功能是否完全丢失?它当然感觉我错过了一些明显的东西 - 我认为需要将绘制的data.tree作为图像存储是很常见的。但我不知道我还能探索哪些潜在的解决方案。

我非常感谢任何人的指示!

3 个答案:

答案 0 :(得分:5)

正如塞巴斯蒂安-c所建议的那样,现在的工作方式与Matherion的建议略有不同,如R 3.3.3所示,data.tree 0.7.0和DiagrammeR 0.9.0

先决条件:需要安装DiagrmmeRsvg和依赖项。根据您的操作系统,要使其正常工作,您可能需要安装V8。例如在ubuntu上:

apt-get install libv8-3.14-delibv8-3.14-dev

然后在R:

install.packages("DiagrammeRsvg")

在Windows上,我没有安装任何东西(可能是因为安装了Chrome?)。

一旦DiagrammeRsvg可用,请运行:

library(data.tree)
data(acme)
library(DiagrammeR)
export_graph(ToDiagrammeRGraph(acme), "export.pdf")

答案 1 :(得分:1)

我至少部分地找到了答案。存在一个专用于将GraphViz图表导出到SVG的包:DiagrammeRsvg

这样可行:

treeAsSVG <- export_svg(grViz(ToGraphViz(acme)));
writeLines(treeAsSVG, "filename.svg"));

grViz是将ToGRaphViz输出实际转换为可由export_svg解释的内容所必需的。我仍然不确定(还)会发生什么事情 - 例如,工作:

export_graph(grViz(ToGraphViz(acme)), file_name="filename.svg");

但是,如果其他人有类似问题而且偶然发现了这个问题,也许这个部分答案可以帮助他们至少输出一些可以集成到例如html页面。

答案 2 :(得分:1)

通过使用as.phylo()转换极致它可以工作,但看起来有点无聊:

plot(as.phylo(acme),
     show.node.label=TRUE,
     node.pos=2,
     no.margin=TRUE
     )
# adding edge labels
edgelabels(as.vector(acme$Get("cost"))[-1],
           adj = c(0,-0.5),
           frame = "none")

solution with as.phylo()

我也试过as.igraph。但是,节点重叠,看起来更不漂亮:

plot(0, type="n", ann=FALSE, axes=FALSE, 
 xlim=extendrange(ig[,1]), 
 ylim=extendrange(ig[,2]))
plot(ig,
 layout=layout_as_tree(ig,root=1),
 vertex.shape="rectangle",
 vertex.size=(strwidth(V(ig)$name) + strwidth("oo")) * 100,
 #vertex.size2=strheight("I") * 2 * 100,
 edge.label=acme$Get("p",traversal = "level")[-1]
)

solution with as.igraph()