[英]Color nodes based on condition in a graph
我有這個數據集:
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在多個列中。 直到link100為止的link44都是引文,但僅存在於book1中,而不存在於其他書籍中。 因為書和引文都以單詞作為標題,並且為了制作圖形,所以將書名更改為帶編號的節點,將引文更改為編號的鏈接也無濟於事。 一本以上的書籍所共有的引用具有相同的ID,即ielink1
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)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.