【问题标题】:Fit labels in nodes in DiagrammeR在 DiagrammeR 中的节点中拟合标签
【发布时间】:2021-12-30 10:59:07
【问题描述】:

我需要在节点上绘制带有 2 路边和标签的有向网络。节点名称的长度有时很短,有时很长。数据是动态生成的,所以每次都是随机的。

这是我的数据示例:

library(DiagrammeR)

# create data:
links=data.frame(
    source=c("AAAAAAAAAAAAAAAAAAAAAAAA","AAAAAAAAAAAAAAAAAAAAAAAA", "AAAAAAAAAAAAAAAAAAAAAAAA", "AAAAAAAAAAAAAAAAAAAAAAAA", "AAAAAAAAAAAAAAAAAAAAAAAA","J", "BBBBBBBBB",
             "BBBBBBBBBBBBBBBBBBBBB", "CCCCCCCCCCC", "CCCCCCCCCCC", "D","IIIIIIII"),
    target=c("BBBBBBBBBBBBBBBBBBBBB","BBBBBBBBBBBBBBBBBBBBB", "CCCCCCCCCCC", "D", 
             "J","AAAAAAAAAAAAAAAAAAAAAAAA","E", "F", "G", "H", "IIIIIIII","IIIIIIII")
)


labels <- unique(c(links$source,links$target))

nodes <- data.frame (id = labels, label = labels )

i_graph_1 <-
    DiagrammeR::create_graph() %>% 
    DiagrammeR::add_nodes_from_table(
        table = nodes,
        label_col = label) %>% 
    DiagrammeR::add_edges_from_table(
        table = links,
        from_col = source,
        to_col = target,
        from_to_map = id_external)%>% 
    select_nodes_by_id(nodes = 1:length(labels)) %>% 
    set_node_attrs_ws(
        node_attr = shape,
        value = "rectangle") %>% 
    clear_selection()

gr <- i_graph_1 %>% DiagrammeR::render_graph()

writeLines(
    export_svg(gr), "c:\\temp\\n1.svg"
    )



我的结果图:

  1. 是否可以使 AB、AJ 链接双向而不是 2 个单向链接?
  2. 是否可以在节点中放置标签而不重叠节点边界?

更新:

如果我使用fixedsize = False,结果仍然不好。节点重叠。

i_graph_1 <-
    DiagrammeR::create_graph() %>% 
    DiagrammeR::add_nodes_from_table(
        table = nodes,
        label_col = label) %>% 
    DiagrammeR::add_edges_from_table(
        table = links,
        from_col = source,
        to_col = target,
        from_to_map = id_external)%>% 
    select_nodes_by_id(nodes = 1:length(labels)) %>% 
    set_node_attrs(node_attr = "fixedsize",values = FALSE) %>% 
    set_node_attrs_ws(
        node_attr = shape,
        value = "rectangle") %>% 
    clear_selection()

【问题讨论】:

  • 这与您的 previous question 有何不同?
  • 那个是关于 igraph 的,这个是关于 DiagrammeR 的。不同的代码、数据结构和渲染器。
  • 在这种情况下,您似乎不知道解决方案的实施。创建一个通用问题可能比创建两个特定于实现的问题更好。这将避免人们将时间浪费在第二个多余的解决方案上。
  • 我可以做到,但是这个问题将包含数百行代码和3张大图。我也问过关于 Cytoscape 的同样问题。不确定这是一种好方法。
  • set_node_attrs(node_attr = "fixedsize",values = FALSE) ;请参阅rich-iannone.github.io/DiagrammeR/ndfs_edfs.html 了解可以更改的属性。

标签: r diagrammer


【解决方案1】:

关键是使用graphviz属性 布局=dot, 集中=true

并且 node_attr = "fixedsize",values = FALSE。

library(DiagrammeR)

# create data:
links=data.frame(
    source=c("AAAAAAAAAAAAAAAAAAAAAAAA","AAAAAAAAAAAAAAAAAAAAAAAA", "AAAAAAAAAAAAAAAAAAAAAAAA", "AAAAAAAAAAAAAAAAAAAAAAAA", "AAAAAAAAAAAAAAAAAAAAAAAA","J", "BBBBBBBBB",
             "BBBBBBBBBBBBBBBBBBBBB", "CCCCCCCCCCC", "CCCCCCCCCCC", "D","IIIIIIII"),
    target=c("BBBBBBBBBBBBBBBBBBBBB","BBBBBBBBBBBBBBBBBBBBB", "CCCCCCCCCCC", "D", 
             "J","AAAAAAAAAAAAAAAAAAAAAAAA","E", "F", "G", "H", "IIIIIIII","IIIIIIII")
)

# Turn it into igraph object


labels <- unique(c(links$source,links$target))

nodes <- data.frame (id = labels, label = labels )

i_graph_1 <-
    DiagrammeR::create_graph() %>% 
    add_global_graph_attrs("layout", "dot", "graph") %>%
    add_global_graph_attrs("concentrate", "true", "graph") %>%
    DiagrammeR::add_nodes_from_table(
        table = nodes,
        label_col = label) %>% 
    DiagrammeR::add_edges_from_table(
        table = links,
        from_col = source,
        to_col = target,
        from_to_map = id_external)%>% 
    select_nodes_by_id(nodes = 1:length(labels)) %>% 
    set_node_attrs(node_attr = "fixedsize",values = FALSE) %>% 
    set_node_attrs_ws(
        node_attr = shape,
        value = "rectangle") %>% 
    clear_selection()


gr <- i_graph_1 %>% DiagrammeR::render_graph( )
gr

结果如下:

【讨论】:

    【解决方案2】:

    不确定 1。但是 2 是可能的。您只需要使用edge_aes(dir="both") 属性。 https://rdrr.io/cran/DiagrammeR/man/edge_aes.html

    library(DiagrammeR)
    library(dplyr)
    
    graph <-
      create_graph() %>%
      add_path(
        n = 3,
        type = "path",
        edge_aes = edge_aes(
          style = "dot",
          color = c("red", "blue"),
          dir="both"))
    
    
    graph %>%
      get_edge_df()
    
    my_graph <- graph %>% DiagrammeR::render_graph()
    my_graph
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-23
      • 1970-01-01
      • 2023-02-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多