Разноцветные узлы с использованием igraph и vertex.pie

Я хотел бы создать разноцветные узлы. Я хотел бы остаться с igraph, Я уже нашел vertex.shape.pie вариант.

Вот некоторые примеры данных:

test_fun <- function(color1,color2,len){
  vec <- replicate(len,sample(c(color1,color2,NA),1))
  return(vec)
}

set.seed(50)
num_nodes<- 20
test_graph <- erdos.renyi.game(num_nodes, 1/6)
V(test_graph)$color_1 <- test_fun("darkgreen","blue",num_nodes)
V(test_graph)$color_2 <- test_fun("brown","blueviolet",num_nodes)
V(test_graph)$color_3 <- test_fun("red","green",num_nodes)
V(test_graph)$color_4 <- test_fun("red","green",num_nodes)
plot(test_graph, vertex.size=7)


>test_graph
IGRAPH U--- 20 28 -- Erdos renyi (gnp) graph
+ attr: name (g/c), type (g/c), loops (g/l), p (g/n), color_1 (v/c), color_2 (v/c), color_3 (v/c), color_4 (v/c)

Как вы можете видеть, я представил NAс когда я использовал test_fun, Это специально для того, чтобы напоминать мои данные.

Теперь я хочу, чтобы вершины были круговыми диаграммами, используя vertex.shape.pie вариант. Каждый узел должен быть раскрашен в соответствии с цветами атрибутов color_1, color_2, color_3 и color_4. Если столбец для узла отсутствует NA, 4 цвета назначены, если один столбец для узла NA, 3 цвета назначены, и так далее.

Спасибо за помощь!

PS.:

Вот пример igraph из http://igraph.org/r/doc/vertex.shape.pie.html

g <- graph.ring(10)
values <- lapply(1:10, function(x) sample(1:10,3))
if (interactive()) {
  plot(g, vertex.shape="pie", vertex.pie=values,
       vertex.pie.color=list(heat.colors(5)),
       vertex.size=seq(10,30,length=10), vertex.label=NA)
}

Но я не смог применить это на своем примере

РЕДАКТИРОВАТЬ изменил семя до 50

1 ответ

Решение

vertex.pie требуется список значений / пропорций, которые каждый цвет будет иметь в круговой диаграмме. Вам нужно конвертировать ваши color_* переменные к этому.

Для этого вы можете сначала связать их вместе:

v<-cbind(V(test_graph)$color_1,V(test_graph)$color_2,V(test_graph)$color_3,V(test_graph)$color_4)

Затем для каждой вершины создайте вектор из 6 значений (по одному для каждого цвета), содержащий 0 и 1, 1, если узел имеет этот цвет, и 0, если его нет.

colors<-c("darkgreen","blue","blueviolet","brown","red","green")
values<-apply(v,1,function(x){
  sapply(colors,function(y){ifelse(y %in% x,1,0)})
})
values<-as.list(as.data.frame(values)) 

Затем вы можете построить график, используя функцию, которую вы упомянули:

plot(test_graph, vertex.shape="pie", vertex.pie=values,
    vertex.pie.color=list(colors),
    vertex.size=seq(10,30,length=10))

Я изменил set.seed до 50, потому что с 42 некоторые вершины получают только NAs поэтому они не могут быть построены...

Общий код будет:

library(igraph)

test_fun <- function(color1,color2,len){
  vec <- replicate(len,sample(c(color1,color2,NA),1))
  return(vec)
}

set.seed(50)
num_nodes<- 20
test_graph <- erdos.renyi.game(num_nodes, 1/6)
V(test_graph)$color_1 <- test_fun("darkgreen","blue",num_nodes)
V(test_graph)$color_2 <- test_fun("brown","blueviolet",num_nodes)
V(test_graph)$color_3 <- test_fun("red","green",num_nodes)
V(test_graph)$color_4 <- test_fun("red","green",num_nodes)

colors<-c("darkgreen","blue","blueviolet","brown","red","green")

v<-cbind(V(test_graph)$color_1,V(test_graph)$color_2,V(test_graph)$color_3,V(test_graph)$color_4)
values<-apply(v,1,function(x){
  sapply(colors,function(y){ifelse(y %in% x,1,0)})
})
values<-as.list(as.data.frame(values)) 

plot(test_graph, vertex.shape="pie", vertex.pie=values,
     vertex.pie.color=list(colors),
     vertex.size=seq(10,30,length=10))
Другие вопросы по тегам