2017-05-26 61 views
4

我想使用構面繪製圖形,其中面板之間的邊緣會有所不同。面板按字母順序自動排序(如ggplot中的慣例)。一個簡單的例子:在ggraph中控制構面順序

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) 

enter image description here

這是很大的,該節點位置presevered,但邊緣不同取決於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) 

enter image description here

我該如何給自定義訂購的方面?

回答

2

GGRAPH使用與ggplot2相同的概念,即使用因子完成分類數據的排序。因此,您可以通過將排序編碼爲facet變量中的級別來控制構面排序。

雖然有一個小問題 - igraph對因素的支持不是很好,所以在分配給節點或邊緣數據時,經常會丟失因素。我已經提交了解決此問題的PR to igraph,但同時我建議您使用tidygraph解決此問題。最終tidygraph將在GGRAPH一切背後使用,所以你還不如在船上

獲得如果你決定直接的igraph工作,不能使用vertex.attributes()等待下一個版本,你可以得到因素的igraph這種方式:

vertex.attributes(graph)$factor_attr <- value

或等價與edge.attributes

+0

謝謝托馬斯!我根本沒有和igraph結婚,但我打算在CRAN發行版中使用它,所以我認爲tidygraph現在有點太早了。我會密切關注未來的發展,並會嘗試igraph代碼! – Axeman

+0

Tidygraph將在下一次dplyr發佈之後的夏天在CRAN上發佈,因此根據您的時間表,這可能不是問題 – ThomasP85

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) 

enter image description here