【问题标题】:How to create a directed network graph with aligned nodes in R?如何在 R 中创建具有对齐节点的有向网络图?
【发布时间】:2017-10-02 11:20:30
【问题描述】:

我想要这样的东西

带或不带标签但节点对齐的网络图。 我怎样才能得到它?

我已经将包 Diagrammer 和 Visnetwork 用于其他图表,因此使用相同的包将是一个好处。

library(DiagrammeR)
library(visNetwork)

from=c("A","A","A","A","B","B","B","C","C","D")
to=c("B","C","D","E","C","D","E","D","E","E")
nodesd=c("A","B","C","D","E")

使用制图师:

nodes <- create_node_df(  n=length(nodesd), label=nodesd,  width=0.3) 
edges <- create_edge_df(from = factor(from, levels=nodesd), to = factor(to, levels=nodesd), rel = "leading_to")   
graph <- create_graph(nodes_df = nodes, edges_df = edges)
render_graph(graph)

我也尝试过 set_node_position() 但似乎没有任何区别。

使用 Visnetwork

nodes <- data.frame(id=nodesd, label= nodesd ) 
edges <- data.frame(from=from, to =to, length=150)
visNetwork(nodes,edges, width="100%" , height="100%")  %>% 
visNodes(shape = "circle") %>%  visEdges(arrows = 'to', smooth =T)  

如您所见,节点未对齐。我怎样才能强迫它这样做?

我可以手动拖动它们,但如果你有很多图表,这不是你想做的事情,而且结果也不好。

我必须通过添加行来使用 visnetwork 垂直执行此操作

  %>%   visHierarchicalLayout()

最后。但是效果不好,因为很多边消失了。

如果我想获得水平对齐,我需要将其添加到节点定义中。

level = c(1,1,1,1,1)

【问题讨论】:

  • 也欢迎使用 TikZ、igraph... 的其他解决方案

标签: r graph diagram


【解决方案1】:

DiagrammeRvisNetwork 无法为您提供帮助,但使用 igraph 很容易做到这一点。您只需要指定一个简单的节点布局。您还需要调整边缘的曲率。我在下面的示例中有一些有用的东西,但是您可以对其进行调整以使其更具艺术性。

library(igraph)
EL = cbind(from, to)
g = graph_from_edgelist(EL)

L = cbind(1:5, 5:1)
CURVE = c(0,0.15, 0.3, 0.45, 0, -0.15, -0.3, 0, 0.15, 0) 
plot(g, layout=L, edge.curved=CURVE)

【讨论】:

  • 有没有办法避免手动指定曲率?
  • 你可以只使用edge.curved=TRUE,但结果更难看。我想拍一张更像你的照片。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-10-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-04
  • 2021-08-05
  • 1970-01-01
相关资源
最近更新 更多