Управление порядком фасетов в ggraph

Я хочу построить график, используя грани, где края варьируются между панелями. Панели автоматически упорядочиваются в алфавитном порядке (как это принято в ggplot). Простой пример:

library(igraph)
library(ggraph)

g <- make_empty_graph() + 
  vertices(1:2) +
  edges(1:2, 2:1, g = c('b', 'a'))

ggraph(g, 'kk') + 
  geom_edge_link(arrow = grid::arrow()) + 
  geom_node_label(aes(label = name)) +
  facet_edges(~g)

Это здорово, позиции узлов сохраняются, но края различаются в зависимости от g,

Однако я хочу выбрать порядок появления фасетов. Так что в этом случае сначала b затем aтак же, как я заказал их при создании графика выше.

В ggplot можно было бы изменить порядок фактора g, Тем не менее, создание макета не показывает g:

create_layout(g, 'kk')
           x             y name ggraph.orig_index circular ggraph.index
1 -0.9021575 -1.410825e+00    1                 1    FALSE            1
2 -1.0000000  1.224606e-16    2                 2    FALSE            2

Изменение атрибутов ребра в фактор вручную изменяет порядок, но метки приводятся к числовому:

g2 <- make_empty_graph() + 
  vertices(1:2) +
  edges(1:2, 2:1, g = factor(c('b', 'a'), levels = c('b', 'a')))

ggraph(g2, 'kk') + 
  geom_edge_link(arrow = grid::arrow()) + 
  geom_node_label(aes(label = name)) +
  facet_edges(~g)

Как я могу дать индивидуальный заказ для граней?

2 ответа

Решение

ggraph использует ту же концепцию, что и ggplot2, то есть упорядочение категориальных данных осуществляется с использованием факторов. Поэтому вы можете управлять порядком фасетов, кодируя их как уровни в переменной фасета.

Однако есть небольшая проблема - у igraph не очень хорошая поддержка факторов, поэтому факторы часто будут отбрасываться при назначении данным узла или ребра. Я представил PR в igraph, который решает эту проблему, но пока я бы предложил вам использовать тидиграф, который решает эту проблему. В конечном счете, тидиграф будет использоваться за всем в ggraph, так что вы можете с таким же успехом попасть на борт

Если вы намерены работать непосредственно в igraph и не можете дождаться следующей версии, вы можете получить факторы в igraph, используя vertex.attributes() таким образом:

vertex.attributes(graph)$factor_attr <- value

Или эквивалентно edge.attributes

Одно из возможных решений - сначала привести к фактору (как второй график в вопросе), а затем использовать пользовательский ярлык, который просто повторяет фактические метки фактора:

my_lab <- function(labels) {
  list(g = c('b', 'a'))
}

ggraph(g2, 'kk') + 
  geom_edge_link(arrow = grid::arrow()) + 
  geom_node_label(aes(label = name)) +
  facet_edges(~g, labeller = my_lab)

Другие вопросы по тегам