Reputation: 199
I have this dataset:
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))
and I would like the nodes which have value equals to 0 have red color and the nodes with value equals or greater than one have red color and their circle be bigger depending on how large the value is.
Is it possible to make it using igraph?
Dataset with edges. Input dataframe:
EDIT from comment
I made this dataset based on books and citations. Books = nodes and citations = link. Every book is unique and has citations. The citation could be common to more than one books. That's why i.e. link1 is in multiple columns. The link44 until link100 are citations but which exist only in book1 but not in other books. Because books and citations have words as titles and in order to make a graph it could be not helpful I changed the book titles to nodes with numbering and citations to links which numbering. Citations which are common to more than one book the have the same 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
))
In the graph every node depicted by a circle with a diameter proportional to the number of frequency. The column names are the nodes and the links in every row are the connecting elements.
How is it possible to give to the link nodes a color of yellow and the nodes with 0 frequency a node of red?
Upvotes: 1
Views: 1459
Reputation: 25844
# 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)
Upvotes: 2