如何使用其他信息创建代表不同群集的网络?

问题描述

我有一个数据框nodes,其中包含如下所示的信息:

dput(nodes)

structure(list(Names = c("A4GALT","AASS","ABCA10","ABCA7","ABCD4","ABHD4","ABTB1","AC006978.2","AC009119.2"),type = c("typeA","typeA","typeC","typeB","typeB"),type_num = c(1L,1L,3L,2L,2L),Clusters = c("Cluster1","Cluster1","Cluster2","Cluster3","Cluster2")),row.names = c(NA,9L),class = "data.frame") 

因此,在nodes数据框中,有4列。 Names是基因名称,type是不同的类型,type_num是每个基因类型的编号,列Clusters显示了每个基因所属的3个簇。 >

类似地,我还有其他数据框edges,其信息如下:

dput(边缘)

structure(list(fromNode = c("A4GALT","A4GALT","AC006978.2"),toNode = c("AASS","AC009119.2",weight = c(0.005842835,0.002253695,0.014513253,0.004851739,0.066702792,0.009418991,0.001136938,0.000474221,0.004405601,0.000666001,0.005625977,0.0333554,0.004666223,0.000103131,0.00026302,0.004514819,0.029632695,0.001825839,0.028379806,0.001403298,0.008339397,0.02393394,0.004782329,0.024767355,0.002986813,0.00559471,0.005961539,0.064831874,0.013023138,0.027935729,0.006618816,0.001134219,0.012798368,0.007961242,0.01640476,0.007997743
),direction = c("undirected","undirected","undirected")),-36L),class = "data.frame")

尝试过igraph,但看起来并不符合我的要求。

library(igraph)
net <- graph_from_data_frame(d=edges,vertices=nodes,directed=F)

as_edgelist(net,names=T)
as_adjacency_matrix(net,attr="weight")

# Removing loops from the graph:
net <- simplify(net,remove.multiple = F,remove.loops = T) 

# Let's and reduce the arrow size and remove the labels:
plot(net,edge.arrow.size=.4,vertex.label=NA)

它看起来像这样:

enter image description here

任何人都可以帮助我如何使用上述数据创建如上所述的网络。任何帮助表示赞赏。预先谢谢你。

解决方法

这主要是对Grouped layout based on attribute的回答的重复。

认为您要按Clusters属性对顶点进行分组,并使用type属性对顶点进行着色。我将在这个答案中做到这一点。 您创建网络的代码很好,但是简单的绘图不会按簇对顶点进行分组(我已按类型为顶点着色)。

plot(net,edge.arrow.size=.4,vertex.label=NA,vertex.color=as.numeric(factor(nodes$type)))

Ungrouped network plot

您需要的是一种布局,该布局将突出集群。上面引用的先前答案显示了如何通过生成具有相同顶点但在同一簇中的顶点之间具有较重的边权重的不同图形来实现此目的。就您而言,应该是

Grouped.net = net
E(Grouped.net)$weight = 1

## 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=80))
} 

## Now create a layout based on G_Grouped
set.seed(567)
LO = layout_with_fr(Grouped.net)

## Use the layout to plot the original graph
plot(net,layout=LO,vertex.color=as.numeric(factor(nodes$type)))

network grouped by cluster

如果您有大量的顶点,您可能还希望使用vertex.size = 4减小其大小

,

我不确定下面的代码是否有效

plot(net,edge.width = E(net)$weight,vertex.color = factor(V(net)$name),mark.groups = split(V(net)$name,V(net)$Clusters))

给出 enter image description here

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...