2017-02-08 20 views
3

Мне не удалось сохранить график, сгенерированный функцией plot.Node в data.tree. Я пробовал следующее:В R, как мне сохранить файл 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 

Очевидно, что экспорт to GraphViz не совсем экспортирует в то, что ожидает DiagrammeR.

Я нахожусь в RStudio и теоретически могу просто сохранить сюжет с использованием графического интерфейса, но мне нужно это для скрипта.

По-видимому, plot.Node фактически не участок ничего - вместо этого он генерирует html/js. Означает ли это, что этот результат нельзя сохранить как графический? Или есть какая-то функция экспорта/преобразования где-то, что я полностью отсутствует? я чувствую, что мне не хватает чего-то очевидного - я предполагаю, что нужно хранить застроенные изображения data.tree, так как изображения довольно распространены. Но я понятия не имею, какие потенциальные решения я могу изучить.

Я был бы очень признателен за любые указатели, у кого есть!

ответ

2

Как Себастиан-с предположил, все работает теперь немного по-другому, чем предложено Matherion, а из R 3.3.3 с данными. дерево 0.7.0 и DiagrammeR 0.9.0

Необходимые условия: необходимо установить DiagrmmeRsvg и зависимости. В зависимости от вашей ОС, для этого вам, возможно, придется установить V8. Например, на убунту:

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

Я нашел ответ, по крайней мере, частично. Существует пакет, предназначенный для экспорта диаграмм 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-страницы.

+0

Где делает 'функция ToGraphViz' взялась? –

+0

Это, похоже, не работает с более новыми версиями пакета. Я использовал 'treeAsSVG <- export_svg (render_graph (ToDiagrammeRGraph (acme))) вместо этого. –

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()

 Смежные вопросы

  • Нет связанных вопросов^_^