簡體   English   中英

控制ggraph中的facet順序

[英]Controlling facet order in ggraph

我想使用facet繪制圖形,其中邊緣在面板之間變化。 面板按字母順序自動排序(按照ggplot中的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')
  xy 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變量中的級別來控制構面順序。

但是有一個小問題 - igraph對因子沒有很好的支持,因此在分配給節點或邊緣數據時通常會丟棄因子。 我已經向igraph提交了一個解決這個問題的PR ,但與此同時我建議你使用tidygraph來解決這個問題。 最終tidygraph將在ggraph中的所有內容后面使用,所以你也可以加入

如果您決定直接在igraph中工作而不能等待下一個版本,您可以通過以這種方式使用vertex.attributes()將因子轉換為igraph:

vertex.attributes(graph)$factor_attr <- value

或者與edge.attributes等效

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM