1

我尝试了示例代码,visExport()并且能够将“导出为 PNG”按钮添加到闪亮的网页。但这需要用户交互才能按下按钮将网络导出为 PNG 图像文件。

我有数百个网络,并希望将它们分别导出为 PNG 文件。其中一些需要定期更新。因此,如果用户无需为每个网络按下“导出为 PNG”按钮,就能够将它们全部导出为 PNG 文件,这在逻辑上会很好。

那么是否可以以编程方式将网络列表一个一个导出到PNG?这就像visSave()为每个网络一个一个地导出 HTML。

4

2 回答 2

0

简短的回答必须是“是”,但由于您没有给我们任何示例代码,因此不可能给您一个经过测试的解决方案。但是你说你有一百个网络。让我们假设在一个向量networks中。(对下面的示例代码稍作更改后,列表也可以使用。)您可以使用闪亮按钮导出一个图形。因此,您必须拥有创建单个网络映像的代码。假设在一个函数createImageForNetwork(x)中,网络在哪里x。您还需要一个函数来为每个图像创建一个输出文件名。假设它被称为getFilename(x). 然后像下面未经测试的代码之类的东西会做你想做的事:

exportNetworkImage <- function(x) {
  png(getFilename(x))
  createImageForNetwork(x)
  dev.off()
}
lapply(1:length(networks), function(x) exportNetworkImage(networks[x]))

如果您想在 Shiny 应用程序中单击一个按钮来执行此操作,那么只需将该代码放入按钮的observeEvent处理程序中。

于 2020-05-20T06:58:59.690 回答
0

参考其他帖子,这里是使用 webshot 包的工作代码。

library(visNetwork)
library(tidyverse)
library(webshot)

# create network data
nodes = data.frame(id = numeric(),label=character(),set = numeric(),stringsAsFactors = F)
edges = data.frame(from = numeric(),to = numeric(),set = numeric(),stringsAsFactors = F)
for (i in 1:10){
  tempNodes <- data.frame(id = 1:15, label = paste("Label", 1:15), set = i)
  tempEdges <- data.frame(from = trunc(runif(15)*(15-1))+1,
                          to = trunc(runif(15)*(15-1))+1, set = i)
  nodes = rbind(nodes,tempNodes)
  edges = rbind(edges,tempEdges)
}

# loop through each set to export to PNG
for (i in 1:max(nodes$set)){
  subNodes = nodes[nodes$set==i,]
  subEdges = edges[edges$set==i,]
  network = visNetwork(subNodes, subEdges, width="100vw",height = "100vh") %>% 
    visLayout(randomSeed=1,improvedLayout=TRUE) %>% 
    visGroups(groupname = "actorImported",shape="circle") %>%  
    visEdges(smooth=FALSE) %>% 
    visPhysics(solver = "barnesHut") 
  fname = paste0("network",sprintf("%03d",i),".html")
  visSave(network,fname)
  webshot(fname,delay=0.5,zoom=2,file=paste0("network",sprintf("%03d",i),".png"),
          vwidth=900,vheight=900)
}
于 2020-05-23T14:24:39.080 回答