2017-10-18 19 views
2

私は自動的にエッジ交差の数を最小限にするためにダイア伝えることができますどのように...次のおもちゃの例のように、ダイアグラマでダイアグラムでエッジ交差の数を最小限に抑えるには、R?

library(DiagrammeR) 
Dia <- function(edg, nodesd) { 
     nodes <- create_node_df( n=length(nodesd), label=nodesd, 
     width=0.3) 
     edges <- create_edge_df(from = edg$EveFrom, to = edg$EveTo, 
       rel = "leading_to") 
graph <- create_graph( nodes_df = nodes, edges_df = edges) 
render_graph(graph) 
} 


niv <- c("A","B","C","D","E","X","Y") 

temp <- data.table(EveFrom=factor(c("A","A","A","A","B","C","D","E", 
    "X", "B"), levels=niv), 
EveTo=factor(c("B","C","D","E","X","X","Y","Y","Y", "C"), levels=niv)) 

Dia(temp,niv) 

enter image description here

をネットワークグラフをプロット?

この単純な例では、CとBの位置が交換された場合、結果にはエッジが交差しません。 より複雑な例では、すべての交差点を削除することはできませんが、少なくとも交差点を最小化することはできません。

visnetworkで、私は、ノード

enter image description here

を再配置することができます。しかし、それはあなたがベクタ形式としてエクスポートすることはできません。例えば、他の欠点を有しています。

PD:これは(隠されたラベル付き)bergant溶液で出力されます。 enter image description here enter image description here

答えて

1

私はdotレイアウトは、より良い、それを生産すると思います。このようにグローバル属性を追加します(hereからインスピレーションで作られた)

graph <- create_graph( nodes_df = nodes, edges_df = edges) 
graph <- set_global_graph_attrs(graph, "layout", "dot", "graph") 
graph <- add_global_graph_attrs(graph, "rankdir", "LR", "graph") 

g

+0

が、私のvisnetwork結果を模倣することも可能ですか? (例えば、各辺にラベルを付けたり、辺の幅を変更する) – skan

+1

ラベル:はい、 'create_edge_df'(文字列のベクトル)に' label'引数を追加します。 – bergant

+0

幅: 'penwidth' = 3を使用してください。 – bergant

1

使用dotレイアウトオプション

# install.packages(c("DiagrammeR"), dependencies = TRUE) 
library(DiagrammeR) 

grViz(" 
digraph dot { 

graph [layout = dot] # dot, neato, twopi, and circo 

A -> {B C D E} 
B -> {C X} 
C -> {X} 
D -> {Y} 
E -> {Y} 
X -> {Y} 
}") 

dot layoutttt

+0

円形レイアウトが必要な場合のコマンドラインとは何ですか?または、どのように座標を固定するには?私が見た唯一のオプション(x =とy =を持つcreate_node_df)は、render_graph(graph、output = "visNetwork")を使用しているときにのみ動作するようですが、その出力をベクトルプロットとして保存することはできません。 – skan

+0

新しい質問をすることをお勧めします。約1つのことを行い、この質問と回答を参考にしてください。 –

関連する問題