Как контролировать цвет узла в ggraph? - PullRequest
0 голосов
/ 14 января 2019

У меня есть сетевой график, и я хотел бы покрасить края, чтобы соответствовать их соответствующим узлам. Это довольно просто на графике igraph, но я бы предпочел сделать на ggraph, как мне нравится другая эстетика, предлагаемая пакетом.

В ggraph кажется, что контроль над цветом узла невелик; в то время как цвет края покрыт широко.

У меня такой вопрос: как я могу сопоставить свои ребра с их узлами, которые были окрашены с помощью пользовательской функции, чтобы каждое ребро, которое «покидает» узел, было окрашено так же, как и его узел. Это должно помочь людям легче отслеживать потоки через сеть. Более общий вопрос заключается в следующем: как ggraph назначает цвета вне эстетического аргумента. Мой вопрос похож на другой вопрос, который я задавал здесь ранее, но наоборот (сопоставить ребра с узлами), нашел здесь .

Вот воспроизводимый пример:

library(tidyverse)
library(igraph)
library(ggraph)
library(tidygraph)
library(RColorBrewer)

## the custom function using Color Brewer
cols_f <- colorRampPalette(RColorBrewer::brewer.pal(11, 'Spectral'))

## make the graph
g <- erdos.renyi.game(50, .1) 

# provide some names
V(g)$name <- 1:vcount(g)

#plot using ggraph
g %>% 
  as_tbl_graph() %>% 
  activate(nodes) %>% 
  mutate(degree  = centrality_degree()) %>% 
  ggraph()+
  geom_edge_fan(aes(color = as.factor(from),
                    alpha = ..index..),
                show.legend = F)+
  geom_node_point(aes(size = degree), 
                  color = cols_f(vcount(g)), # custom function for node color
                  show.legend = F)+
  scale_color_manual(values = cols_f(ecount(g)))+ # custom function for edge color
  coord_equal()

enter image description here

1 Ответ

0 голосов
/ 16 марта 2019

Я лично считаю, что работа с объектом layout полезна для понимания отображения переменных.

Имеет классы "layout_igraph" + "layout_ggraph" + "data.frame" и содержит

  1. a data.frame для узлов с их координатами, определенными create_layout, а также
  2. входной объект "tbl_graph" + "igraph" (см. attributes(layout)$graph)

К первому обращаются geom_node_point, чтобы нарисовать узлы, второму - geom_edge_fan, чтобы нарисовать края.

Цвет узлов можно контролировать с помощью стандарта ggplot2 scale_color_manual, цвет краев с добавлением ggraph scale_edge_color_manual. Оба могут использоваться с одним и тем же именем узла ~ сопоставлением цветов, если атрибут limits установлен соответствующим образом, поскольку он содержит ...

символьный вектор, определяющий возможные значения шкалы и их порядок.


library(tidyverse)
library(igraph)
library(ggraph)
library(tidygraph)

## the custom function using Color Brewer
cols_f <- colorRampPalette(RColorBrewer::brewer.pal(11, 'Spectral'))

## make the graph
g <- erdos.renyi.game(50, .1) 

# provide some names
V(g)$name <- 1:vcount(g)

# plot using ggraph
graph_tbl <- g %>% 
  as_tbl_graph() %>% 
  activate(nodes) %>% 
  mutate(degree  = centrality_degree()) 

layout <- create_layout(graph_tbl, layout = 'igraph', algorithm = 'nicely')

ggraph(layout) +
  geom_edge_fan(
    aes(color = as.factor(from), alpha = ..index..),
    show.legend = F
  ) +
  geom_node_point(
    aes(size = degree, color = as.factor(name)),
    show.legend = F
  ) +
  scale_color_manual(
    limits = as.factor(layout$name),
    values = cols_f(nrow(layout))
  ) +
  scale_edge_color_manual(
    limits = as.factor(layout$name),
    values = cols_f(nrow(layout))
  ) +
  coord_equal()

example graph

...