r - 基于图形中条件的颜色节点



我有这个数据集:

df <- structure(list(name = structure(c(1L, 3L, 4L, 5L, 6L, 7L, 8L, 
9L, 10L, 2L), .Label = c("node1", "node10", "node2", "node3", 
"node4", "node5", "node6", "node7", "node8", "node9"), class = "factor"), 
value = c(100L, 14L, 2L, 0L, 25L, 0L, 0L, 43L, 7L, 0L)), .Names = c("name", 
"value"), class = "data.frame", row.names = c(NA, -10L))

我希望值等于 0 的节点具有红色,值等于或大于 1 的节点具有红色,并且它们的圆圈更大,具体取决于值的大小。

是否可以使用igraph进行?

带边的数据集。输入数据框:

评论编辑

我根据书籍和引文制作了这个数据集。书籍=节点,引文=链接。每本书都是独一无二的,都有引用。引用可能不止一本书。这就是为什么 link1 在多列中。link44 到 link100 是引用,但只存在于 book1 中,而在其他书籍中不存在。因为书籍和引文有单词作为标题,为了制作图表,它可能没有帮助,我将书名更改为带有编号的节点,并将引文更改为编号的链接。多本书共有的引文,具有相同的id,即link1

dput(df)
structure(list(node1 = structure(c(1L, 13L, 24L, 35L, 46L, 57L, 
68L, 79L, 90L, 2L, 4L, 5L, 6L, 7L, 8L, 9L, 10L, 11L, 12L, 14L, 
15L, 16L, 17L, 18L, 19L, 20L, 21L, 22L, 23L, 25L, 26L, 27L, 28L, 
29L, 30L, 31L, 32L, 33L, 34L, 36L, 37L, 38L, 39L, 40L, 41L, 42L, 
43L, 44L, 45L, 47L, 48L, 49L, 50L, 51L, 52L, 53L, 54L, 55L, 56L, 
58L, 59L, 60L, 61L, 62L, 63L, 64L, 65L, 66L, 67L, 69L, 70L, 71L, 
72L, 73L, 74L, 75L, 76L, 77L, 78L, 80L, 81L, 82L, 83L, 84L, 85L, 
86L, 87L, 88L, 89L, 91L, 92L, 93L, 94L, 95L, 96L, 97L, 98L, 99L, 
100L, 3L), .Label = c("link1", "link10", "link100", "link11", 
"link12", "link13", "link14", "link15", "link16", "link17", "link18", 
"link19", "link2", "link20", "link21", "link22", "link23", "link24", 
"link25", "link26", "link27", "link28", "link29", "link3", "link30", 
"link31", "link32", "link33", "link34", "link35", "link36", "link37", 
"link38", "link39", "link4", "link40", "link41", "link42", "link43", 
"link44", "link45", "link46", "link47", "link48", "link49", "link5", 
"link50", "link51", "link52", "link53", "link54", "link55", "link56", 
"link57", "link58", "link59", "link6", "link60", "link61", "link62", 
"link63", "link64", "link65", "link66", "link67", "link68", "link69", 
"link7", "link70", "link71", "link72", "link73", "link74", "link75", 
"link76", "link77", "link78", "link79", "link8", "link80", "link81", 
"link82", "link83", "link84", "link85", "link86", "link87", "link88", 
"link89", "link9", "link90", "link91", "link92", "link93", "link94", 
"link95", "link96", "link97", "link98", "link99"), class = "factor"), 
node2 = structure(c(1L, 9L, 10L, 11L, 12L, 13L, 14L, 2L, 
3L, 4L, 5L, 6L, 7L, 8L, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
NA, NA), .Label = c("link1", "link10", "link11", "link12", 
"link13", "link14", "link15", "link16", "link4", "link5", 
"link6", "link7", "link8", "link9"), class = "factor"), node3 = structure(c(1L, 
2L, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
NA, NA, NA, NA, NA, NA, NA, NA, NA), .Label = c("link1", 
"link2"), class = "factor"), node4 = c(NA, NA, NA, NA, NA, 
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
NA, NA, NA, NA, NA), node5 = structure(c(1L, 12L, 19L, 20L, 
21L, 22L, 23L, 24L, 25L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 
10L, 11L, 13L, 14L, 15L, 16L, 17L, 18L, NA, NA, NA, NA, NA, 
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA), .Label = c("link1", 
"link10", "link11", "link12", "link13", "link14", "link15", 
"link16", "link17", "link18", "link19", "link2", "link20", 
"link21", "link22", "link23", "link24", "link25", "link3", 
"link4", "link5", "link6", "link7", "link8", "link9"), class = "factor"), 
node6 = c(NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA), node7 = c(NA, 
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
NA, NA, NA, NA, NA, NA, NA, NA, NA), node8 = structure(c(1L, 
12L, 23L, 34L, 39L, 40L, 41L, 42L, 43L, 2L, 3L, 4L, 5L, 6L, 
7L, 8L, 9L, 10L, 11L, 13L, 14L, 15L, 16L, 17L, 18L, 19L, 
20L, 21L, 22L, 24L, 25L, 26L, 27L, 28L, 29L, 30L, 31L, 32L, 
33L, 35L, 36L, 37L, 38L, NA, NA, NA, NA, NA, NA, NA, NA, 
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
NA, NA, NA, NA), .Label = c("link1", "link10", "link11", 
"link12", "link13", "link14", "link15", "link16", "link17", 
"link18", "link19", "link2", "link20", "link21", "link22", 
"link23", "link24", "link25", "link26", "link27", "link28", 
"link29", "link3", "link30", "link31", "link32", "link33", 
"link34", "link35", "link36", "link37", "link38", "link39", 
"link4", "link40", "link41", "link42", "link43", "link5", 
"link6", "link7", "link8", "link9"), class = "factor"), node9 = structure(c(1L, 
2L, 3L, 4L, 5L, 6L, 7L, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
NA, NA, NA, NA, NA, NA, NA, NA, NA), .Label = c("link1", 
"link2", "link3", "link4", "link5", "link6", "link7"), class = "factor"), 
node10 = c(NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA)), .Names = c("node1", 
"node2", "node3", "node4", "node5", "node6", "node7", "node8", 
"node9", "node10"), class = "data.frame", row.names = c(NA, -100L
))

在图中,每个节点都由一个直径与频率数成正比的圆圈描绘。 列名是节点,每行中的链接是连接元素。

如何为链路节点提供黄色,而为频率为 0 的节点提供红色节点?

# As the links are in the same row index under each node they
# can be converted to 1/0 (presence of link/not) by 
# the links being missing or otherwise
# From this you can create adjacency matrix between the nodes by
# taking the crossproduct
x <- as.matrix(df)
x <- !is.na(x)
adjMat <- crossprod(x)
library(igraph)
# Read in the adjacency matrix
g = graph_from_adjacency_matrix(adjMat, mode="undirected", weighted=TRUE, diag=FALSE)
# For your original question
# set colour by setting V(g)$color attribute
# if diagonal is nonzero vertex colour is red else blue
V(g)$color <- ifelse(diag(adjMat), "red", "blue")
# Similarily for size: here vertex size is set to the number of 
# citations each book has (the diagonal of adj matrix)
V(g)$size <- diag(adjMat)
# Plot setting the edge weight equal to the number of shared links
plot(g, edge.width=E(g)$weight/2)
# If you want to remove the nodes with zero citations
# probably an igraph function to do this but you can do it manually
g1 <- g - paste0("node", which(diag(adjMat)==0))
plot(g1, edge.width=E(g1)$weight/2)

最新更新