igraph中的绘图网络问题

时间:2019-03-21 11:46:36

标签: r plot igraph reshape2

在使用igraph库实现R中的双向网络时,我遇到了一些问题。这是我的脚本:

library(igraph)
library(reshape2)
setwd("....")
getwd()
library(readxl)
network=read_excel("network1.xlsx")
print(network)
subjects=as.character(unlist(network[,1]))
agents=colnames(network[-1])
print(network)
network = network[,-1]
g=graph.incidence(network, weighted = T)
V(g)$type
V(g)$name=c(subjects,agents)
V(g)$color = V(g)$type
V(g)$color=gsub("FALSE","red",V(g)$color)
V(g)$color=gsub("TRUE","lightblue",V(g)$color)
plot(g, edge.arrow.width = 0.3,
     vertex.size = 5, 
     edge.arrow.size = 0.5,
     vertex.size2 = 5,
     vertex.label.cex = 1,
     vertex.label.color="black",
     asp = 0.35, 
     margin = 0,
     edge.color="grey",
     edge.width=(E(g)$weight),
     layout=layout_as_bipartite)

网络布局正确

如您所见

as you can see

但是我有两个问题

(1)我不了解顶点在图中显示的顺序。它们与excel文件的顺序不同,字母顺序或数字顺序都不相同。它们似乎是随机排列的。如何选择顶点放置的顺序?

(2)我不明白为什么有些顶点更靠近在一起,而有些顶点更远。我会将所有顶点都放在相同的距离处。我该怎么办?

非常感谢您的宝贵帮助。

2 个答案:

答案 0 :(得分:1)

由于您不提供数据,因此我将通过虚构示例进行说明。

样本图数据

library(igraph)
set.seed(123)
EL = matrix(c(sample(8,18, replace=T),
    sample(LETTERS[1:6], 18, replace=T)), ncol=2)
g = simplify(graph_from_edgelist(EL))
V(g)$type = bipartite_mapping(g)$type 
VCol = c("#FF000066", "#0000FF66")[as.numeric(V(g)$type)+1]
plot(g, layout=layout_as_bipartite(g), vertex.color=VCol)

Raw graph

与图形一样,这有两个问题。节点是任意排序的 下排的行距很奇怪。让我们一次解决这些问题。 为此,我们需要控制布局,而不是使用任何 自动布局功能。布局只是一个vcount(g) * 2矩阵 给出用于绘制的顶点的x-y坐标。在这里,我要放一个 通过将y坐标指定为1,将另一行指定为第一行中的节点类型 通过指定y = 0在较低行中的节点。我们要水平指定订单 在每个组中按等级(按字母顺序)排列。所以

LO = matrix(0, nrow=vcount(g), ncol=2)
LO[!V(g)$type, 2] = 1
LO[V(g)$type, 1]  = rank(V(g)$name[V(g)$type]) 
LO[!V(g)$type, 1] = rank(V(g)$name[!V(g)$type])
plot(g, layout=LO, vertex.color=VCol)

Ordered graph, but unbalanced

现在两行都是有序的,并且是均匀分布的,但是因为行数较少 底行中的顶点看起来不吸引人,不平衡。我们 可以通过拉伸最下面一行来解决此问题。我发现更容易做出正确的决定 如果坐标从0到(节点数)-1而不是1,则为比例因子 1至(节点数)如上所述。这样做,我们得到

LO[V(g)$type, 1]  = rank(V(g)$name[V(g)$type]) - 1
LO[!V(g)$type, 1] = (rank(V(g)$name[!V(g)$type]) - 1) * 
    (sum(V(g)$type) - 1)  /  (sum(!V(g)$type) - 1)
plot(g, layout=LO, vertex.color=VCol)

Balanced, ordered graph

答案 1 :(得分:0)

非常感谢。我执行了一个非常有用的示例,并在第一步中正确地处理了我的数据,并保持了边缘的不同厚度以及所有与我的绘图相同的厚度,但是顺序正确。这非常重要,非常感谢。但是,在理解如何用数据正确调整顶部和底部行时遇到了一些麻烦,因为它们似乎总是离得太近了。可能我不能完全理解我必须处理的坐标。这是我的数据。

> `> network=read_excel("network1.xlsx",2)
> dput(network)
structure(list(`NA` = c(2333, 2439, 2450, 2451, 2452, 2453, 2454, 
2455, 2456, 2457, 2458, 2459, 2460, 2461, 2480, 2490, 2491, 2492, 
2493, 2494, 2495), A = c(12, 2, 2, 5, 2, 0, 5, 3, 0, 0, 7, 0, 
0, 0, 6, 2, 10, 7, 1, 2, 5), B = c(0, 1, 0, 1, 0, 0, 2, 0, 0, 
0, 0, 0, 1, 0, 5, 0, 2, 0, 0, 0, 0), C = c(0, 0, 0, 0, 1, 0, 
4, 0, 0, 0, 0, 1, 0, 0, 2, 0, 4, 4, 2, 1, 0), D = c(2, 0, 0, 
0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 7, 0, 4, 0, 1, 4, 0), E = c(11, 
2, 3, 3, 3, 8, 3, 6, 4, 1, 1, 0, 12, 0, 5, 0, 4, 6, 4, 8, 9), 
    F = c(2, 0, 0, 3, 1, 0, 10, 1, 0, 0, 0, 1, 0, 0, 9, 0, 0, 
    1, 1, 3, 3), G = c(0, 3, 1, 1, 0, 0, 0, 0, 0, 3, 2, 0, 0, 
    0, 1, 0, 0, 2, 0, 1, 0), H = c(0, 0, 2, 0, 0, 0, 1, 0, 0, 
    0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 1), I = c(0, 0, 0, 0, 0, 
    0, 3, 0, 6, 3, 0, 0, 1, 0, 7, 0, 0, 4, 1, 2, 0), J = c(0, 
    0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 
    0)), class = c("tbl_df", "tbl", "data.frame"), row.names = c(NA, 
-21L), .Names = c(NA, "A", "B", "C", "D", "E", "F", "G", "H", 
"I", "J"))
> print(network)
     NA  A B C D  E  F G H I J
1  2333 12 0 0 2 11  2 0 0 0 0
2  2439  2 1 0 0  2  0 3 0 0 0
3  2450  2 0 0 0  3  0 1 2 0 0
4  2451  5 1 0 0  3  3 1 0 0 0
5  2452  2 0 1 0  3  1 0 0 0 0
6  2453  0 0 0 0  8  0 0 0 0 1
7  2454  5 2 4 2  3 10 0 1 3 0
8  2455  3 0 0 0  6  1 0 0 0 0
9  2456  0 0 0 0  4  0 0 0 6 0
10 2457  0 0 0 0  1  0 3 0 3 0
11 2458  7 0 0 0  1  0 2 0 0 0
12 2459  0 0 1 0  0  1 0 0 0 0
13 2460  0 1 0 0 12  0 0 0 1 0
14 2461  0 0 0 0  0  0 0 0 0 0
15 2480  6 5 2 7  5  9 1 2 7 1
16 2490  2 0 0 0  0  0 0 0 0 0
17 2491 10 2 4 4  4  0 0 0 0 0
18 2492  7 0 4 0  6  1 2 0 4 0
19 2493  1 0 2 1  4  1 0 0 1 0
20 2494  2 0 1 4  8  3 1 0 2 0
21 2495  5 0 0 0  9  3 0 1 0 0
> `