控制 ggraph 中的刻面顺序
Controlling facet order in 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)
如何为构面提供自定义排序?
一个可能的解决方案是首先强制因子(如问题中的第二个图),然后使用自定义标签器简单地鹦鹉学舌地返回实际因子标签:
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)
ggraph使用了与ggplot2相同的概念,即分类数据的排序是通过使用因子来完成的。因此,您可以通过将顺序编码为 facet 变量中的级别来控制 facet 顺序。
虽然有一个小问题 - igraph 对因子的支持不是很好,因此在分配给节点或边缘数据时,因子通常会被丢弃。我已经提交了一个解决这个问题的 PR to igraph that solves this, but in the meantime I would suggest you use tidygraph。最终 tidygraph 将用于 ggraph 中的所有内容,因此您也可以加入
如果您决定直接在 igraph 中工作并且等不及下一个版本,您可以通过使用 vertex.attributes()
以这种方式将因素纳入 igraph:
vertex.attributes(graph)$factor_attr <- value
或等价于edge.attributes
我想使用小平面绘制图形,其中面板之间的边缘不同。面板自动按字母顺序排序(按照 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)
如何为构面提供自定义排序?
一个可能的解决方案是首先强制因子(如问题中的第二个图),然后使用自定义标签器简单地鹦鹉学舌地返回实际因子标签:
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)
ggraph使用了与ggplot2相同的概念,即分类数据的排序是通过使用因子来完成的。因此,您可以通过将顺序编码为 facet 变量中的级别来控制 facet 顺序。
虽然有一个小问题 - igraph 对因子的支持不是很好,因此在分配给节点或边缘数据时,因子通常会被丢弃。我已经提交了一个解决这个问题的 PR to igraph that solves this, but in the meantime I would suggest you use tidygraph。最终 tidygraph 将用于 ggraph 中的所有内容,因此您也可以加入
如果您决定直接在 igraph 中工作并且等不及下一个版本,您可以通过使用 vertex.attributes()
以这种方式将因素纳入 igraph:
vertex.attributes(graph)$factor_attr <- value
或等价于edge.attributes