使用R中的igraph创建网络图

时间:2014-05-15 20:16:48

标签: r igraph

我需要一些帮助才能开始在R中使用igraph。我有一个包含三列的.csv文件:

  1. 第一列是一个字符串,代表"来自"节点,
  2. 第二列是一个字符串,表示"到"节点,然后
  3. 第三列是Double,表示关系的强度。
  4. 我将文件读入R,我尝试将其转换为数据框并以这种方式绘制图形,但它没有用。 我的最终目标是将此.csv文件转换为加权网络图,但我不确定如何启动。

2 个答案:

答案 0 :(得分:14)

这个(来自igraph文档的改编示例)可以帮助您入门:

# Load package
library(igraph)

# Make up data
relations <- data.frame(from=c("Bob", "Cecil", "Cecil", "David", "David", "Esmeralda"),
                        to=c("Alice", "Bob", "Alice", "Alice", "Bob", "Alice"),
                        weight=c(4,5,5,2,1,1))
# Alternatively, you could read in the data from a similar CSV file as follows:
# relations <- read.csv("relations.csv")

# Load (DIRECTED) graph from data frame 
g <- graph.data.frame(relations, directed=TRUE)

# Plot graph
plot(g, edge.width=E(g)$weight)

enter image description here

答案 1 :(得分:8)

igraph中没有引起足够重视的一个主题是如何控制布局的问题。在您的情况下,大概您希望节点之间的分离与它们之间的关系强度相关。这可以使用layout中的plot.igraph(...)参数进行控制。

有大约十几种用于计算布局的算法,但我发现最有用的算法是layout.fruchterman.reingold(...),它基本上将边缘视为一组弹簧,其弹簧常数由weights参数设置为功能。然后,算法通过允许弹簧达到平衡来固定顶点的位置。这意味着具有高边缘权重的顶点通常将更靠近在一起。

所以,使用另一个答案中定义的图表:

par(mfrow=c(1,2))
set.seed(1)
plot(g)
plot(g,layout=layout.fruchterman.reingold(g,weights=E(g)$weight^3))

你可以从右边的图表中看到鲍勃,爱丽丝和塞西尔彼此更接近,因为“他们之间的关系强度”,例如边缘权重更大(4-5)。 Esmeralda和Alice被一个很大的间隙隔开,因为边缘重量只有1.注意Bob和David比你想象的更接近,因为他们的边缘重量与Esmeralda和Alice相同。这是因为他们的分离受到大卫也与爱丽丝相关联的事实的影响。