如何在R中创建具有对齐节点的有向网络图?

时间:2017-10-02 11:20:31

标签: r graph diagram

我想得到类似的东西

enter image description here 带或不带标签但节点对齐的网络图。 我怎么能得到它?

我已经将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")

使用Diagrammer:

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)

enter image description here

我也尝试过使用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)  

enter image description here 如您所见,节点未对齐。我怎么强迫它这样做呢?

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

enter image description here

我必须通过添加线

垂直地进行visnet
  %>%   visHierarchicalLayout()

最后。但它不能很好地工作,因为许多边缘消失了。

enter image description here

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

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

enter image description here

1 个答案:

答案 0 :(得分:2)

我无法通过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)

Graph with Layout