如何重新缩放绘图以将簇(节点)进一步分开,并在igraph中命名簇?
我有节点和边缘信息,并试图用这些信息绘制网络图。节点信息包含1552行信息: 边缘信息由四列组成,共有1203576个条目 使用我在下面代码中使用的节点和边数据来绘制网络图如何重新缩放绘图以将簇(节点)进一步分开,并在igraph中命名簇?,r,graph,igraph,network-analysis,R,Graph,Igraph,Network Analysis,我有节点和边缘信息,并试图用这些信息绘制网络图。节点信息包含1552行信息: 边缘信息由四列组成,共有1203576个条目 使用我在下面代码中使用的节点和边数据来绘制网络图 library(igraph) net <- graph_from_data_frame(d=edges, vertices=nodes, directed=F) plot(net, edge.arrow.size=.4,vertex.label=NA, vertex.color=as.numeric(f
library(igraph)
net <- graph_from_data_frame(d=edges, vertices=nodes, directed=F)
plot(net, edge.arrow.size=.4,vertex.label=NA,
vertex.color=as.numeric(factor(nodes$type)))
Grouped.net = net
E(Grouped.net)$weight = 1
colnames(nodes)[4] <- "Clusters"
## Add edges with high weight between all nodes in the same group
for(Clus in unique(nodes$Clusters)) {
GroupV = which(nodes$Clusters == Clus)
Grouped.net = add_edges(Grouped.net, combn(GroupV, 2), attr=list(weight=500))
}
## Now create a layout based on G_Grouped
set.seed(567)
LO = layout_with_fr(Grouped.net)
# Generate colors based on media type:
colrs <- c("gray50", "yellow", "tomato")
V(net)$color <- colrs[V(net)$type_num]
plot(net, layout=LO, edge.arrow.size=0,vertex.label=NA, asp=0, vertex.size=4)
legend(x=-1.5, y=-1.1, c("typeA","typeB", "typeC"), pch=21,
col="#777777", pt.bg=colrs, pt.cex=2, cex=.8, bty="n", ncol=1)
库(igraph)
net你有几个问题。我将尝试回答所有问题,但顺序不同
设置
library(igraph)
edges = read.csv("temp/edges_info_5Clusters.csv", stringsAsFactors=T)
nodes = read.csv("temp/nodes_info_5Clusters.csv", stringsAsFactors=T)
问题3。如何将节点类型C置于顶部?
节点按节点编号的顺序打印。为了得到
不经常显示的类型,我们需要这些节点来获得最高的
节点编号。因此,只需对类型进行排序,以强制节点处于
订单类型A,类型B,类型C
nodes = nodes[order(nodes$type),]
net <- graph_from_data_frame(d=edges, vertices=nodes, directed=F)
现在我们需要在每个簇中布置点,并将它们隔开
使用刚刚创建的集群布局。但这里有一个权衡。
如果使集群相距很远,则所有节点都将很小
而且很难看到。如果希望节点更大,则需要使
更紧密地聚集在一起(以便它们都适合于绘图)。你有
如此多的链接,无论你做什么,链接都会模糊在一起
只是一个灰色的背景。我选择了一个对我有吸引力的中间立场,
但是,我邀请您探索因子Stretch
的不同值。
Stretch
的值越大,集群之间的距离就越远
较小的节点。较小的值将使簇更加紧密
具有较大的节点。选择适合你的东西
set.seed(1234)
HierLO = matrix(0, ncol=2, nrow=vcount(net))
for(i in 1:length(levels(nodes$Clusters))) {
CLUST = which(nodes$Clusters == levels(nodes$Clusters)[i])
SubNet = induced_subgraph(net, V(net)[CLUST])
LO_SN = scale(layout_nicely(SubNet))
HierLO[CLUST, ] = LO_SN +
matrix(LO_F5[i,], nrow=vcount(SubNet), ncol=2,byrow=TRUE)
}
plot(net, layout=HierLO, edge.arrow.size=0,vertex.label=NA, vertex.size=4,
edge.color="lightgray")
您现在可以看到所有的TypeC节点和大部分的TypeB(除了集群1中有大量的TypeB)
最后,让我们添加集群标签。这些只需要相对于集群中心放置。这些中心在某种程度上是由布局LO_F5给定的,但igraph plotting会重新缩放布局,以便该绘图实际具有范围(-1,1)。
我们可以自己重新调整LO_F5的比例,然后稍微拉伸位置,使标签刚好位于圆圈之外
LO_Text = LO_F5
LO_Text[,1] = 2*(LO_F5[,1] - min(LO_F5[,1]))/(max(LO_F5[,1]) - min(LO_F5[,1])) -1
LO_Text[,2] = 2*(LO_F5[,2] - min(LO_F5[,2]))/(max(LO_F5[,2]) - min(LO_F5[,2])) -1
text(1.2*LO_Text, labels=levels(nodes$Clusters))
legend(x=-1.5, y=-1.1, c("typeA","typeB", "typeC"), pch=21,
col="#777777", pt.bg=colrs, pt.cex=2, cex=.8, bty="n", ncol=1)
链接仍然是一个问题,但我认为这解决了您的其他问题。您发布数据的网站需要安装新的Windows驱动程序。我不会这样做,我也不建议其他人这样做。您能找到一些方法来提供您的数据,而不需要我修改我的机器吗?@G5W我还将数据保存在dropbox中,并在此处共享https://www.dropbox.com/sh/w10weg5k9qh1zq4/AABHY9XxA0ap_cxxi3q01C7Ea?dl=0
请告诉我您是否可以下载。我可以获得dropbox版本。谢谢这可能需要一段时间,但我会尽力的respond@G5W当然好了。非常感谢你的回答。这很有帮助。是的,现在只有集群之间的链接才是问题所在。我会调查的。又是唐克。
set.seed(1234)
HierLO = matrix(0, ncol=2, nrow=vcount(net))
for(i in 1:length(levels(nodes$Clusters))) {
CLUST = which(nodes$Clusters == levels(nodes$Clusters)[i])
SubNet = induced_subgraph(net, V(net)[CLUST])
LO_SN = scale(layout_nicely(SubNet))
HierLO[CLUST, ] = LO_SN +
matrix(LO_F5[i,], nrow=vcount(SubNet), ncol=2,byrow=TRUE)
}
plot(net, layout=HierLO, edge.arrow.size=0,vertex.label=NA, vertex.size=4,
edge.color="lightgray")
LO_Text = LO_F5
LO_Text[,1] = 2*(LO_F5[,1] - min(LO_F5[,1]))/(max(LO_F5[,1]) - min(LO_F5[,1])) -1
LO_Text[,2] = 2*(LO_F5[,2] - min(LO_F5[,2]))/(max(LO_F5[,2]) - min(LO_F5[,2])) -1
text(1.2*LO_Text, labels=levels(nodes$Clusters))
legend(x=-1.5, y=-1.1, c("typeA","typeB", "typeC"), pch=21,
col="#777777", pt.bg=colrs, pt.cex=2, cex=.8, bty="n", ncol=1)