2017-06-18 101 views
1

我有这样的数据集:颜色节点

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具有红色,并与值的节点等于或大于一具有红色的节点颜色和他们的圈子取决于值的大小。

是否可以使用igraph?

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

编辑从评论

我做了基于书籍和引用此数据集。书籍=节点和引文=链接。每本书都是独一无二的,并且有引文。引用可能是不止一本书的共同之处。这就是为什么即link1在多列中。链接44直到链接100是引文,但只存在于书1中,但不存在于其他书中。因为书和引文有单词作为标题,为了制作一张图,这可能没有帮助,我将书名改为编号和引用链接编号的节点。引文中共同的一个以上的书有相同的ID i.e.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频率的节点是红色的?

+0

你似乎在你的图中没有任何边缘? – user20650

+0

@ user20650是的,我没有任何边缘。 – Sasak

+2

好吧,你可以通过设置'V(g)$ color'来颜色顶点(见[this](https://stackoverflow.com/questions/15999877/correctly-color-vertices-in-r-igraph))并调整顶点大小在绘图时设置'vertex.size'(参见[this](https://stackoverflow.com/questions/12058556/adjusting-the-node-size-in-igraph-using-a-matrix)) – user20650

回答

2
# 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)