将Igraph转换为VisNetwork

3

我使用“igraph”库制作了这个网络图:

library(tidyverse)
library(igraph)


set.seed(123)
n=15
data = data.frame(tibble(d = paste(1:n)))

relations = data.frame(tibble(
  from = sample(data$d),
  to = lead(from, default=from[1]),
))

data$name = c("new york", "chicago", "los angeles", "orlando", "houston", "seattle", "washington", "baltimore", "atlanta", "las vegas", "oakland", "phoenix", "kansas", "miami", "newark" )

graph = graph_from_data_frame(relations, directed=T, vertices = data) 
(edge_fac <- forcats::as_factor(get.edgelist(graph)[,1]))
n2 <- as.integer(factor(data$name,levels = levels(edge_fac)))


V(graph)$color <- ifelse(data$d == relations$from[1], "red", "orange")
V(graph)$label <- paste0(data$name,"\n\n\n",n2)
plot(graph, layout=layout.circle, edge.arrow.size = 0.2, main = "my_graph")

是否可以将上述图形转换为“visnetwork”图形,使其看起来像这样?
我知道有一个函数(visIgraph()),用于将“igraph”图形转换为“visnetwork”图形:https://www.rdocumentation.org/packages/visNetwork/versions/2.1.0/topics/visNetwork-igraph 但我不确定是否可以将第一个具有“numeric”和“text”标签的“igraph”图形转换为交互式的“visnetwork”图形。
我尝试使用以下代码进行操作:
visIgraph(graph)

但这样创建的交互式图表没有“数字”标签。

这可行吗?

谢谢!


1
请查看 toVisNetworkDatavisIgraph - G5W
谢谢!我现在就会去查看这个! - stats_noob
你认为“toVisNetworkData()”函数可以用来解决这个问题吗?https://dev59.com/a8Pra4cB1Zd3GeqPnsJy - stats_noob
2个回答

2
使用visNetwork创建图表怎么样?然后您可以在节点内添加数字和名称作为标签。请保留HTML标记,但不要写解释。
library(tidyverse)
library(visNetwork)

set.seed(123)
n=15
data = data.frame(tibble(id = paste(1:n)))

relations = data.frame(tibble(
  from = sample(data$id),
  to = lead(from, default=from[1]),
))

data$name = c("new york", "chicago", "los angeles", "orlando", "houston", "seattle", "washington", "baltimore", "atlanta", "las vegas", "oakland", "phoenix", "kansas", "miami", "newark" )
data$shape ='circle'
data$label = paste0(data$id,'\n',data$name)
data$color = ifelse(data$id==1, 'red', 'orange')

visNetwork(data, relations, width = "100%") %>%   
  visEdges(arrows =list(to = list(enabled = TRUE))) %>% 
  visIgraphLayout(layout = "layout_in_circle")

Graph


1
非常感谢您的回答!迫不及待想尝试一下! - stats_noob

2
你需要做一些操作才能使其正常工作,因为这是使用基本的R绘图功能。
基本上,这是两个不同的igraph对象互相叠加。这是我能想到的唯一方法来实现两种不同的'cex'大小。这可能需要一些技巧,具体取决于你接下来的操作。
library(tidyverse)
library(igraph)
library(gridGraphics)    # <--- I'm new!
library(grid)            # <--- I'm new!

#----------- from question -----------
set.seed(123)
n=15
data = data.frame(tibble(d = paste(1:n)))    

relations = data.frame(tibble(
  from = sample(data$d),
  to = lead(from, default=from[1]),
))

data$name = c("new york", "chicago", "los angeles", "orlando",
              "houston", "seattle", "washington", "baltimore", 
              "atlanta", "las vegas", "oakland", "phoenix", 
              "kansas", "miami", "newark" )


graph = graph_from_data_frame(relations, 
                              directed=T, 
                              vertices = data) 
(edge_fac <- forcats::as_factor(get.edgelist(graph)[,1]))
n2 <- as.integer(factor(data$name,levels = levels(edge_fac)))
V(graph)$color <- ifelse(data$d == relations$from[1], 
                         "red", "orange")

这是变化开始的地方。
#---------- prepare the first plot -----------
# make label text larger
V(graph)$label.cex = 1.5
# V(graph)$label <- paste0(data$name,"\n",n2)
V(graph)$label <- paste0(n2) # just the number instead

#---------- prepare to collect grob ----------
# collect base plot grob
grabber <- function(){
  grid.echo()
  grid.grab()
}

# create a copy for the top layer
graph2 <- graph

#-------------- plot and grab ----------------
# without arrow sizes
plot(graph, layout=layout.circle, main = "my_graph")

# grab the grob
g1 = grabber() 

现在看第二张图;顶层。
#----------- create the top layer -------------
# with the copy, make the vertices transparent
V(graph2)$color <- "transparent"

# reset the font size
V(graph2)$label.cex = 1 

# shift the labels below (while keeping the plot design the same)
V(graph2)$label <- paste0("\n\n\n\n", data$name)

# show me
plot(graph2, layout=layout.circle,
     main = "my_graph", 
     edge.color = "transparent") # invisible arrows/ only 1 layer of arrows

# grab the grob
g2 = grabber()

分层!

#-------------- redraw the plots -------------
# make the plot background transparent on the top layer
g2[["children"]][["graphics-background"]][["gp"]][["fill"]] <- "transparent"

# draw it!
grid.draw(g1)
grid.draw(g2)

在此输入图片描述

您可能会发现,进入grob的图形与出来的图形不同...grid本质上是对它们进行了调整。我觉得这很棒。


我真的很喜欢这个答案 - 非常感谢!我一直在关注你的许多高质量答案 - 你有使用什么资源来学习 R 吗?非常感谢! - stats_noob
2
我喜欢回答这个问题。 这是一个棘手的问题!学习R?提问,回答问题,敲代码... 这就是你掌握任何编程语言的方法。在代码中进行大量注释——记录哪里出了错,如何解决它——什么不起作用。当你遇到问题时,你真的会喜欢那些注释。(在RStudio->编辑->在文件中查找)解决问题的过程将成为一个过程(即使您没有计划)。我认为你现在已经有了相当好的理解,只要继续使用R。 - Kat
@Kat,我建议你在个人资料中提供一些直接沟通的方式,例如Twitter账户。你提供的帮助是无价的。 :-) - gd047
那我就得记得去查看 Twitter... :) - Kat

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