【问题标题】:How to minimize the number of edge crossings with diagrammer, R?如何使用图解器 R 最小化边缘交叉的数量?
【发布时间】:2017-10-18 13:23:55
【问题描述】:

当我用图表绘制器绘制网络图时,就像下面的玩具示例......

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)  

我如何告诉制图师自动最小化边缘交叉的数量?

在这个简单的例子中,如果 C 和 B 位置交换,结果不会有任何边缘交叉。 在更复杂的例子中,我们不能删除所有的交叉点,但至少可以将其最小化。

使用 visnetwork 我可以重新定位节点

但它还有其他缺点,例如它不允许您将其导出为矢量图形。

PD:这是带有 bergant 解决方案的输出(隐藏标签):

【问题讨论】:

    标签: r graph diagrammer


    【解决方案1】:

    我认为dot 布局会产生更好的效果。像这样添加全局属性:

    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")
    

    【讨论】:

    • 是否也可以模仿我的 visnetwork 结果? (例如在每条边上添加标签或更改边宽)
    • 标签:是的,在create_edge_df(字符串向量)中添加label参数。
    • 宽度:例如使用penwidth = 3
    • 请参阅graphviz.org/doc/info/attrs.html,了解 graphviz 点元素(图形、节点、边等)中的属性
    • @skan 除了上面提供的链接之外,还希望将您指向this SO answer
    【解决方案2】:

    使用dot 布局选项(灵感来自here

    # 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}
    }")
    

    【讨论】:

    • 如果我想要一个圆形布局,命令行是什么?或者我怎样才能将它的位置固定到某个坐标?我见过的唯一选项(带有 x= 和 y= 的 create_node_df)似乎仅在使用 render_graph(graph, output = "visNetwork") 时才有效,但该输出无法保存为矢量图。
    • 我建议你问一个新问题。只讨论一件事,并以此问题和答案作为参考。
    猜你喜欢
    • 1970-01-01
    • 2012-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-05
    相关资源
    最近更新 更多