Управление порядком фасетов в 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)