问题
Now I have a data frame df1
:
v1 v2
a 10
b 1
c 3
d 7
.......
And another data frame df2
:
v1 v2
d a
c a
b c
c d
...
I'd like to plot a network based on df2
with igraph
:
plot(g, layout = layout_in_circle(g))
And the color of vertexes(a,b,c,d...
) should be in range of red to blue and the bigger the value in v2, the color of that vertex should be more closer to red.
I have tried:
require(igraph)
g = graph.data.frame(df)
plot(g, layout = layout_in_circle(g), vertex.color = color.scale(mention_counted$V2,c(0,1,1),c(1,1,0),0))
But the color of vertexes is not map to the value in v2 properly. Is there a way to do that? Thank you in advance!
回答1:
library(igraph)
library(dplyr)
# data frame to get colours
dt1 = data.frame(v1 = c("a","b","c","d"),
v2 = c(10, 1, 3, 7))
dt1
# v1 v2
# 1 a 10
# 2 b 1
# 3 c 3
# 4 d 7
# create color column
dt1$color = colorRampPalette(c("blue","red"))(max(dt1$v2))[dt1$v2]
dt1
# v1 v2 color
# 1 a 10 #FF0000
# 2 b 1 #0000FF
# 3 c 3 #3800C6
# 4 d 7 #AA0055
# data frame to get network
dt2 = data.frame(v1 = c("d","c","b","c"),
v2 = c("a","a","c","d"))
dt2
# v1 v2
# 1 d a
# 2 c a
# 3 b c
# 4 c d
# build graph
g = graph.data.frame(dt2)
# check order of vertices
V(g)
# + 4/4 vertices, named:
# [1] d c b a
# get info for vertices in the right order
dt_info =
data.frame(names = names(V(g))) %>%
inner_join(dt1, by = c("names"="v1"))
dt_info
# names v2 color
# 1 d 7 #AA0055
# 2 c 3 #3800C6
# 3 b 1 #0000FF
# 4 a 10 #FF0000
# plot graph
plot(g, vertex.color = dt_info$color)
来源:https://stackoverflow.com/questions/34994503/mapping-a-specific-column-of-values-to-the-scale-color-of-vertexs-in-r