平行边层次图

2024-09-28 01:32:57 发布

您现在位置:Python中文网/ 问答频道 /正文

我需要从一组数据中创建一个图表。我已经筛选了无数的SO问题,但没有找到一个适合所有必备要求的解决方案。在

需要什么:

http://i.imgur.com/hzQHD07.png

必须具备以下要求:

  1. 节点分层布置
  2. 按顺序放置节点,即“A”应位于“B”的左侧
  3. 节点之间的平行边
  4. 边缘的最小长度(以避免标签侵占节点,如D--E)
  5. 编程解决方案,需要很少或不编辑点文件的理想结果
  6. 扩展到几千个节点

非常重要的要求:

  1. 直线(或正交)
  2. 头尾标签
  3. 显示箭头的选项

图形可以是无向或有向的,但应满足上述要求。在

import networkx as nx
g = nx.Graph()

g.add_edge(node1,node3,headlabel='label 2', taillabel='label 1',fontsize='10')
g.add_edge(node1,node4,headlabel='label 4', taillabel='label 3',fontsize='10')
g.add_edge(node2,node5,headlabel='label 6', taillabel='label 5',fontsize='10')
g.add_edge(node2,node6,headlabel='label 8', taillabel='label 7',fontsize='10')
g.add_edge(node4,node5,headlabel='really long label', taillabel='really long label',fontsize='10')
g.add_edge(node4,node5)
g.add_edge(node3,node7)
g.add_edge(node7,node8)
g.add_edge(node7,node8)
g.add_edge(node4,node8)
g.add_edge(node5,node8)
g.add_edge(node5,node9,headlabel='label 12', taillabel='label 11',fontsize='10')
g.add_edge(node6,node9,headlabel='label 10', taillabel='label 9',fontsize='10')

A = nx.to_agraph(g)
A.add_subgraph([node1,node2],rank='same')
A.add_subgraph([node3,node4,node5,node6],rank='same')
A.add_subgraph([node7,node8,node9],rank='same')
A.draw('example2.png', prog='dot')

上面的结果是:http://i.imgur.com/1e9YTnQ.png

当然,用上述方法不会显示平行边。我尝试使用一个支持平行边的多向图,但由于以下错误而无法使其工作,尽管为平行边定义了唯一键(代码中未显示)。在

^{pr2}$

使用不带networkx的graphviz,如下所示,我得到了平行边,但是层次结构和节点顺序都没有了。我知道层次结构可以通过在点文件中添加rank=same来修复,但我更喜欢用编程的方式。在

import graphviz as gv
g = gv.Graph(format='png')

g.edge(node1,node3,headlabel='label 2', taillabel='label 1',fontsize='10')
g.edge(node1,node4,headlabel='label 4', taillabel='label 3',fontsize='10')
g.edge(node2,node5,headlabel='label 6', taillabel='label 5',fontsize='10')
g.edge(node2,node6,headlabel='label 8', taillabel='label 7',fontsize='10')
g.edge(node4,node5,headlabel='really long label', taillabel='really long label',fontsize='10')
g.edge(node4,node5)
g.edge(node3,node7)
g.edge(node7,node8)
g.edge(node7,node8)
g.edge(node4,node8)
g.edge(node5,node8)
g.edge(node5,node9,headlabel='label 12', taillabel='label 11',fontsize='10')
g.edge(node6,node9,headlabel='label 10', taillabel='label 9',fontsize='10')

g.render('example')

由于信誉不足,无法发布上次渲染的图像链接。在


Tags: add节点labeledge平行node1node5fontsize

热门问题