在R”中结合网络可视化图形和Map

9wbgstp7  于 2023-07-31  发布在  其他
关注(0)|答案(1)|浏览(120)

我想用R创建一个类似于所附的网络可视化图。现有的edgelist包含列“From”和“To”,单独的数据框“nodeInfo”包含有关节点名称、大小、纬度和经度的信息。请帮助创建符合以下条件的图表:
1、基于边列表创建网络可视化图。每个节点的大小应与“nodeInfo$size”中的值成比例。2、如果在edgelist中有重复的“From”和“To”的组合,则在两个节点之间显示多条边(例如:使用诸如弯曲边缘的技术)。3,在图中包括分离株。隔离点是存在于“nodeInfo”中但未在边缘列表中提及的节点。4、根据“nodeInfo$longitude”和“nodeInfo$latitude”值在实际Map上放置节点。使用简单且免费的Map服务,适合学术目的,而不依赖于Google Maps API等付费服务。

set.seed(42) 
nodes <- LETTERS[1:9]
from <- sample(nodes, 7, replace = TRUE)
to <- sample(nodes, 7, replace = TRUE)
edgelist <- data.frame(from, to)

nodeInfo <- data.frame(
  name = nodes,
  size = sample(1:10, 9, replace = TRUE),
  longitude = runif(9, min = 135, max = 145),
  latitude = runif(9, min = 30, max = 40)     
)

字符串
我使用“sna”包创建了一个网络,使用下面的代码,但我不能将其覆盖在Map上,我也不能执行更复杂和详细的任务。如果有更好的方法使用其他包,我真的很感激。

library(sna)
edgeNet <- network(edgelist, matrix.type = "edgelist", loops = TRUE, directed = FALSE, vertices = nodeInfo, multiple = T)
 gplot(edgeNet,xlab="EXample",edge.col ="blue", vertex.col="gray",vertex.cex=nodeInfo$size, usearrows=F, edge.lwd = 0.5, edge.lty = "solid",displaylabels=T,label.cex=0.6)

mmvthczy

mmvthczy1#

如果您迁移到tidygraph/ggraph生态系统,您将拥有大量的绘图选项。
首先,从ggmap::get_stamenmap(一个免费服务)获取Map,并将其转换为长格式 Dataframe 。我们将选择一个简单的线条图,使一个干净,现代的图形:

library(ggmap)

m <- get_stamenmap(bbox = c(left = 130, right = 150, bottom = 30, top = 45),
                   zoom = 6, maptype = "toner-background")

r <- cbind(expand.grid(longitude = seq(130, 150, len = ncol(m)),
                       latitude = seq(45, 30, len = nrow(m))),
           fill = c(m))

字符串
现在,使用节点数据框和边列表创建图形。与其在日本Map上使用随机点,不如使用三个城市。

set.seed(42) 
nodes <- rep(c("Tokyo", "Sapporo", "Osaka"))
from <- sample(nodes, 20, replace = TRUE)
to <- sample(nodes, 20, replace = TRUE)
edgelist <- data.frame(from, to)

nodeInfo <- data.frame(
  name = nodes,
  size = c(14, 1.5, 2.7),
  longitude = c(139.7, 141.4, 135.5),
  latitude =  c(35.7, 43.1, 34.7)   
)


很容易将节点数据和边列表转换成一个整洁的图:

library(tidygraph)

g <- tbl_graph(nodes = nodeInfo, edges = edgelist)


最后,我们将绘制图形,确保首先将Map添加为栅格图层。

library(ggraph)

ggraph(g, "manual", x = nodeInfo$longitude, 
       y = nodeInfo$latitude) +
  geom_raster(data = r, aes(longitude, latitude, fill = fill), alpha = 0.2) + 
  scale_fill_identity() +
  geom_edge_fan(alpha = 0.3) +
  geom_node_point(aes(color = name, size = size))  +
  geom_node_text(aes(label = name), nudge_x = c(1.2, -1.2, -1.2), size = 6) +
  coord_fixed(ratio = nrow(m)/ncol(m), expand = FALSE) +
  scale_size_continuous(range = c(5, 10)) +
  theme_void() +
  guides(size = "none", colour = "none")


x1c 0d1x的数据
有许多可自定义的选项。我们可以选择不同类型的雄蕊图,如“地形-背景”,以及不同的方式来连接节点:


相关问题