我想使用facet绘制图形,其中边缘在面板之间变化。面板按字母顺序自动排序(按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
而异。
但是,我想选择facet出现的顺序。所以在这种情况下,首先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)
如何为方面提供自定义排序?
答案 0 :(得分:4)
一种可能的解决方案是首先强制考虑因素(作为问题中的第二个图),然后使用自定义贴标机简单地鹦鹉回击实际因子标签:
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)
答案 1 :(得分:2)
ggraph使用与ggplot2相同的概念,即分类数据的排序是通过使用因子来完成的。因此,您可以通过将排序编码为facet变量中的级别来控制构面顺序。
虽然存在一个小问题 - igraph对因子没有很好的支持,因此在分配给节点或边缘数据时通常会丢弃因子。我已经提交了PR to igraph来解决这个问题,但与此同时我会建议你使用tidygraph来解决这个问题。最终tidygraph将在ggraph的所有内容后面使用,所以你也可以加入
如果您决定直接在igraph中工作而不能等待下一个版本,您可以通过这种方式使用vertex.attributes()
将因子纳入igraph:
vertex.attributes(graph)$factor_attr <- value
或等同于edge.attributes