绘制定义某些固定节点的网络图,以在地图上绘制图形

时间:2017-03-03 15:40:55

标签: r igraph

我有一个由德国人(和城市)组成的图表(节点)。我想根据他们的位置将城市映射到德国地图上,并根据固定城市添加人员和连接。因此,我不想指定每个人的位置,因为这非常耗时。

有没有办法在地图上绘制网络图,方法是指定城市的位置,而不是连接到城市的人?据我所知,使用igraph,我只能修复所有节点或没有节点,但不能修复一些节点。

是否可以使用igraphmapggmap?我愿意为其他和其他库存档以存档我的想法。

附上你找到我的图表布局。 Network Graph. Blue: People, Green: Cities

编辑:

这是最小的工作示例,使用了库ggmapmapmapdataigraphvisNetwork

persons=c("Name1","Name2","Name3","Name2","Name1","Name4")
cities=c("Bremen","Bremen","Berlin","Berlin","Berlin","Dresden")
edgelist = cbind(persons,cities)
coordlist = geocode(edgelist[,2])
coordlist = cbind(coordlist,edgelist[2])
colnames(coordlist)=c("lon","lat","label")

#1 Plot map with added points for cities 
map("worldHires","germany", col="grey20", fill=TRUE, lwd=0.1)
points(coordlist$lon,coordlist$lat, pch=19,col="red",cex=3)

#2 plot graph with igraph without fixed points
ig = graph.data.frame(edgelist, directed=F)
plot(ig, edge.arrow.size=.4)

使用#1之后的代码,我可以绘制地图和城市,但不知道如何添加定义其坐标的人员节点。

使用#2之后的代码,我可以看到网络图,但不知道如何仅修复城市节点的坐标。我检查了this链接,但似乎我只能通过修复所有节点来改变布局,而不仅仅是城市节点离开人员节点“浮动”。

这是我想要实现的可视化: Goal

1 个答案:

答案 0 :(得分:0)

这是一种方法。关键步骤:(1)使用igraph生成顶点的布局坐标; (2)用lat / lon数据重新编码坐标; (3)为人们的坐标添加一些随机噪声,使他们不与城市重叠; (4)布置地图背景; (5)使用sna添加网络图。

library(maps); library(ggmap); library(igraph); library(mapdata)
persons=c("Name1","Name2","Name3","Name2","Name1","Name4")
cities=c("Bremen","Bremen","Berlin","Berlin","Berlin","Dresden")
edgelist = cbind(persons,cities)
coordlist = geocode(edgelist[,2])
coordlist = cbind(coordlist,edgelist[,2], edgelist[,1])
colnames(coordlist)=c("lon","lat","city", "name")

ig = graph.data.frame(edgelist, directed=F)
l <- layout_nicely(ig)
l[which(V(ig)$name %in% unique(coordlist$city)),1] <- unique(coordlist[which(coordlist$city %in% V(ig)$name[5:7]),1])
l[which(V(ig)$name %in% unique(coordlist$city)),2] <- unique(coordlist[which(coordlist$city %in% V(ig)$name[5:7]),2])
l[which(V(ig)$name %in% unique(coordlist$name)),1] <- coordlist[match(V(ig)$name,as.character(coordlist$name)),1][1:4]
l[which(V(ig)$name %in% unique(coordlist$name)),2] <- coordlist[match(V(ig)$name,as.character(coordlist$name)),2][1:4]
l[1:2,1] <- l[1:2,1] + rnorm(2,2,1.5)
l[3:4,1] <- l[3:4,1] - rnorm(2,1,1)
l[1:4,2] <- jitter(l[1:4,2], 0.25)
col <- c(rep("red", 4), rep("blue", 3))


map("worldHires", "Germany", col="grey50", fill=TRUE, lwd=0.1)
plot.network(intergraph::asNetwork(ig), coord = l, new=FALSE,
             vertex.cex = 2, vertex.col = col)

enter image description here

有几点需要注意 - 乱用随机噪音/ jitter让人们找到你想要的地方,或者找到一种更系统的方式去做;情节很小。可能需要探索如何调整地图背景的大小。