4

我想使用构面绘制图形,其中面板之间的边缘不同。面板按字母顺序自动排序(如 中的惯例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)

在此处输入图像描述

如何为刻面提供自定义排序?

4

2 回答 2

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)

在此处输入图像描述

于 2017-05-26T11:27:44.177 回答
2

ggraph 使用与 ggplot2 相同的概念,即分类数据的排序是通过使用因子来完成的。因此,您可以通过将排序编码为构面变量中的级别来控制构面顺序。

但是有一个小问题 - igraph 对因子没有很好的支持,因此当分配给节点或边缘数据时,因子通常会被丢弃。我已经向igraph 提交了一个 PR 来解决这个问题,但同时我建议你使用tidygraph来解决这个问题。最终 tidygraph 将用于 ggraph 中的所有内容,因此您不妨加入

如果您决定直接在 igraph 中工作并且等不及下一个版本,您可以通过vertex.attributes()以下方式将因素纳入 igraph:

vertex.attributes(graph)$factor_attr <- value

或等效地与edge.attributes

于 2017-05-26T18:10:21.837 回答