绘图&在Python中渲染多路树

时间:2011-08-11 04:11:40

标签: python graph tree graphviz multiway-tree

有人知道我如何以美学上似乎合理的方式绘制多路树? 信息:

  • 或多或少100件
  • 每个级别的项目数大致相同
  • 10级
  • 每个节点都有0(叶子)和6个孩子
  • 每个节点都指定它自己的级别,无论其根源如何。

我目前正在使用PIL,将每个“行”划分为img.size()[0] /节点数,并使用draw.line绘制线来表示边缘,但完全混乱

我希望你能帮助我=],我会发布所需的任何信息。

1 个答案:

答案 0 :(得分:18)

因此,渲染图形是graphviz的特殊天才,它也恰好有几个提供python绑定的库。在我看来,这些绑定库中最好的是pygraphviz。 Graphviz可能是最好的解决方案,也可能是最简单的解决方案。

您在问题中描述的特定布局是一种分层的分层方案,由graphviz' dot 布局引擎轻松执行。 Dot 执行渲染以确保图形以自然树配置布局 - 即,父节点位于其子节点之上;等级的节点(来自根的级别)在可能的情况下与y轴等距,并且在可能的情况下保留自然对称性。

(注意:令人困惑的是, dot 指的是构成 graphviz 的几个布局引擎之一,但 dot 也是名称和文件扩展名所有graphviz文档的文件格式,无论它们如何呈现)。

正如您在我的代码中看到的那样,使用pygraphviz,选择 dot 作为图形的布局引擎很简单,尽管它实际上并不是默认值( neato 是)。

这是我制作的快速图表,然后使用 dot 进行渲染 - 使用 graphviz 通过 pygraphviz 创建和渲染。

请注意,图形具有完美的布局 - 相同程度的节点沿垂直轴在同一水平面上,子节点在父节点下方呈现,并且尽可能保留自然的“对称性”(例如,父节点位于两者之间)正如你所看到的,我的代码没有一个手动控制布局 - graphviz,即 dot ,自动处理它。

import pygraphviz as PG

A = PG.AGraph(directed=True, strict=True)

A.add_edge("7th Edition", "32V")
A.add_edge("7th Edition", "Xenix")
# etc., etc.

# save the graph in dot format
A.write('ademo.dot')

# pygraphviz renders graphs in neato by default, 
# so you need to specify dot as the layout engine
A.layout(prog='dot')


# opening the dot file in a text editor shows the graph's syntax:
digraph unix {
  size="7,5";
  node [color=goldenrod2, style=filled];
  "7th Edition" -> "32V";
  "7th Edition" -> "V7M";
  "7th Edition" -> "Xenix";
  "7th Edition" -> "UniPlus+";
  "V7M" -> "Ultrix-11";
  "8th Edition" -> "9th Edition";
  "1 BSD" -> "2 BSD";
  "2 BSD" -> "2.8 BSD";
  "2.8 BSD" -> "Ultrix-11";
  "2.8 BSD" -> "2.9 BSD";
  "32V" -> "3 BSD";
  "3 BSD" -> "4 BSD";
  "4 BSD" -> "4.1 BSD";
  "4.1 BSD" -> "4.2 BSD";
  "4.1 BSD" -> "2.8 BSD";
  "4.1 BSD" -> "8th Edition";
  "4.2 BSD" -> "4.3 BSD";
  "4.2 BSD" -> "Ultrix-32";
}

enter image description here