首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将图标转换为VisNetwork

将图标转换为VisNetwork
EN

Stack Overflow用户
提问于 2022-02-27 19:42:27
回答 2查看 330关注 0票数 3

我有一个网络图,是我用"igraph“库制作的:

代码语言:javascript
复制
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

但我不确定是否可以将第一个"igraph“图(同时具有”数字“和”文本“标签)转换为一个交互式的"visnetwork”图。

我尝试用以下代码来完成这个任务:

代码语言:javascript
复制
visIgraph(graph)

但是这会创建一个没有“数字”标签的交互式图形。

有可能这样做吗?

谢谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-04-06 01:17:34

您必须做一些操作,以使这一工作,因为这是使用基础R绘图。

从本质上说,这是两个不同的igraph对象,它们相互覆盖。这是我唯一能想到的拥有两个不同的“cex”大小的方法。这可能需要一些技巧,取决于你从这里走到哪里。

代码语言:javascript
复制
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")

这就是改变的开始。

代码语言:javascript
复制
#---------- 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() 

现在是第二张图;顶层

代码语言:javascript
复制
#----------- 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()

放他们一层!

代码语言:javascript
复制
#-------------- 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实际上对它们进行了调整。我觉得挺棒的。

票数 1
EN

Stack Overflow用户

发布于 2022-04-04 15:29:08

如何使用visNetwork创建图形呢?然后,您可以在节点中添加数字和名称作为标签。

代码语言:javascript
复制
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")

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71287944

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档