Применить цветовой градиент к ggraph's `geom_conn_bundle` - PullRequest
2 голосов
/ 08 марта 2019

Контекст

Я использую ggraph, чтобы расположить узлы (листья дерева) в круговой дендрограмме, а затем добавить соединения между некоторыми узлами (используя иерархическое связывание, используя geom_conn_bundle):

library(ggraph)
library(igraph)

# Example data
edges <- data.frame(from="root", to=paste("leaf", seq(1,100), sep=""))
vertices <- data.frame(name = unique(c(as.character(edges$from), as.character(edges$to))) ) 
tree <- graph_from_data_frame( edges, vertices=vertices )

# Drawing nodes
pr <- ggraph(tree, layout = "dendrogram", circular = TRUE) + 
    geom_edge_diagonal(alpha = 0.2)

# Example connection
pr <- pr + geom_conn_bundle(
    data = get_con(from = 23, to = 42),
    alpha=0.8, 
    width=3, 
    colour="skyblue", 
    tension = 0.9
)
print(pr)

Это прекрасно отображает почти прозрачную дендрограмму и некоторые (в этом примере один) соединения в skyblue.

Проблема / Желаемый выход

Мне бы хотелось, чтобы направление соединения обозначалось цветовым градиентом (т. Е. Начиналось с зеленого, медленно переходя в красный) вместо того, чтобы показывать соединение только одним цветом (голубой).Как я могу добиться такого цветового градиента, используя R и ggraph geom_conn_bundle?

Следующий отрывок из Holten (2006) может служить примером того, как я хотел бы, чтобы соединения ссмотреть:

enter image description here

1 Ответ

2 голосов
/ 09 марта 2019

Несколько геомов ggraph для краев чертежа, в том числе geom_conn_bundle и geom_edge_diagonal, имеют рассчитанный индекс индекса.Это число от 0 до 1 того, как далеко вдоль края находится точка.Обратите внимание, что упрощенные версии этих geoms (geom_*0) не рассчитывают его.Некоторые упоминания об этом есть в этом сообщении автора ggraph.

В этом случае сопоставьте индекс stat(index) с цветом внутри aes вашего комплекта, затем установитешкала градиента с (scale_edge_color_gradient, а не scale_color_gradient, как я изначально пытался).

В примере изображения я не могу сказать, масштабируется ли ширина, но то же самое будет работать, например edge_width = stat(index).

library(ggraph)
library(igraph)

ggraph(tree, layout = "dendrogram", circular = TRUE) + 
  geom_edge_diagonal(alpha = 0.2) + 
  geom_conn_bundle(aes(color = stat(index)),
    data = get_con(from = 23, to = 42),
    alpha=0.8, 
    width=3,
    # colour="skyblue", 
    tension = 0.9
  ) +
  scale_edge_color_gradient(low = "green", high = "red")

Создано в 2019-03-09 пакетом Представить (v0.2.1)

...