首页 > 解决方案 > 如何使用 igraph 中的 Cytoscape

问题描述

我们如何使用 Cytoscape 反映 Fruchterman-Reingold 布局?我无法使用 Cytoscape 从 igraph 复制 Fruchterman-Reingold 布局图。

 library(RCy3)
 library(igraph)
 library(ggraph)
 library(tidygraph)
 library(RColorBrewer)

actors <- data.frame(name=c("Alice", "Bob", "Cecil", "David",
                        "Esmeralda"),
                 age=c(48,33,45,34,21),
                 gender=c("F","M","F","M","F"))
relations <- data.frame(from=c("Bob", "Cecil", "Cecil", "David",
                           "David", "Esmeralda"),
                    to=c("Alice", "Bob", "Alice", "Alice", "Bob", "Alice"),
                    same.dept=c(FALSE,FALSE,TRUE,FALSE,FALSE,TRUE),
                    weight=c(4,5,5,2,1,1), advice=c(4,5,5,4,2,3))
 ig <- graph_from_data_frame(relations, directed=F, vertices=actors)

coul  <- brewer.pal(2, "Set1") 
my_color <- coul[as.numeric(as.factor(V(ig)$gender))]
coords <- layout.fruchterman.reingold(ig)
plot(ig,layout=coords, vertex.color=my_color)


cytoscapePing()


createNetworkFromIgraph(ig,"myIgraph")
layoutNetwork('fruchterman-rheingold gravity_multiplier=1 nIterations=100')

标签: rcytoscape

解决方案


我不确定这是否是您问题的正确答案,但我认为您不需要gravity multiplierlayoutNetwork命令中指定。我没有详细检查Fruchterman-reingold算法,但据我了解你的问题,你想在igraphand之间应用相同的算法Cytoscape

为此,我首先看一下默认传递给函数的参数,该函数layout.fruchterman.reingold基本上是调用函数layout_with_fr(在 R 控制台中编写layout_with_fr以查看函数参数)。

查看这个函数的代码可以看到,根据你的写法,只设置了两个参数。第一个是迭代次数(默认设置为 500),第二个是温度开始(start.temp 等于图表的 vcount 的 sqrt)。所以,在这里start.temp = sqrt(5)

Fruchterman-reingold然后,您可以使用以下命令在 Cytoscape中检查算法的属性:

getLayoutPropertyNames("fruchterman-rheingold")

[1] "Available arguments for 'layout fruchterman-rheingold':"
 [1] "attraction_multiplier" "conflict_avoidance"    "defaultEdgeWeight"    
 [4] "edgeAttribute"         "gravity_multiplier"    "layout3D"             
 [7] "max_distance_factor"   "maxWeightCutoff"       "minWeightCutoff"      
[10] "network"               "nIterations"           "nodeAttribute"        
[13] "nodeList"              "randomize"             "repulsion_multiplier" 
[16] "singlePartition"       "spread_factor"         "temperature"          
[19] "type"                  "update_iterations"   

所以,我认为根据你的例子,我们应该只使用nIterationstemperature参数:

createNetworkFromIgraph(ig,"myIgraph")
setNodeShapeDefault("ELLIPSE")
setNodeSizeDefault(30)
setNodeColorMapping("gender", c("F","M"), c( "#E41A1C", "#377EB8"), mapping.type = "d")
setLayoutProperties("fruchterman-rheingold", 
                    list(nIterations=500,
                         temperature = sqrt(5)))
layoutNetwork("fruchterman-rheingold")

你得到这样的表示: 在此处输入图像描述

根据经验,我发现如果您使用gravity_multiplier=1,您还需要传递参数repulsion_multiplier = 1来补偿并使您的网络更具吸引力。

希望它能帮助您找出问题的解决方案。


推荐阅读