绘图 &在 Python 中渲染多路树 [英] Drawing & Rendering Multiway Tree in Python

查看:25
本文介绍了绘图 &在 Python 中渲染多路树的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

有人知道我如何以美观的方式绘制多路树吗?信息:

Does somebody know how do I plot a multiway-tree in a aesthetically plausible way? info:

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

我目前正在使用 PIL,在 img.size()[0]/number of nodes 中划分每个line",并使用 draw.line 绘制线条表示边缘,但它完全搞砸了

I'm currently using PIL, dividing each "line" in img.size()[0]/number of nodes, and drawing lines with draw.line to represent edges, but it is completely messed up

我希望你能帮助我=],任何需要的信息我都会发布.

I hope you can help me =], any information needed I'll post.

推荐答案

所以,渲染图形是 graphviz,它也恰好有几个提供 python 绑定的库.在我看来,这些绑定库中最好的是 pygraphviz.Graphviz 可能是最好的解决方案,也可能是最简单的.

So, rendering graphs is the particular genius of graphviz, which also happens to have several libraries that provide python bindings. In my opinion, the best of these bindings libraries is pygraphviz. Graphviz is probably the best solution and also likely the simplest.

您在问题中描述的特定布局,一种分层的分层方案,由 graphviz 的 dot 布局引擎毫不费力地执行.Dot 执行渲染以确保图以自然树结构布局——即父节点位于其子节点之上;相同等级的节点(从根开始的级别)在可能的情况下与 y 轴等位,并尽可能保留自然对称性.

The particular layout you describe in your Question, a hierarchical, layered scheme, is performed effortlessly by graphviz' dot layout engine. Dot performs the rendering to ensure that the graph is laid out in a natural tree configuration--i.e., parent nodes are positioned above their children; nodes of equal rank (levels from the root) are equi-positioned w/r/t the y-axis when possible, and natural symmetry is preserved when possible.

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

(Note: confusingly, dot refers to one of several layout engines that comprise graphviz, but dot is also the name and file extension of the file format for all graphviz documents regardless of how they are rendered).

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

As you can see in my code that follows, using pygraphviz, it's simple to select dot as layout engine for your graph, though it's not actually the default (neato is).

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

Here's a quick graph i made and then rendered using dot--created and rendered using graphviz via pygraphviz.

请注意,该图具有完美的布局——相同度数的节点沿垂直轴位于同一级别,子节点呈现在父节点下方,并在可能的情况下保留自然对称"(例如,父节点位于以及它的两个子节点之上.正如你所看到的,我的代码没有手动控制布局——graphviz,即dot,自动处理它.

Notice that the graph has perfect layout--nodes of the same degree are on the same level along a vertical axis, children are rendered below parents and natural 'symmetry' is preserved when possible (e.g., a parent node is positioned between and above its two child nodes. And as you can see, none of my code manually controls the layout--graphviz, i.e., dot, handles it automatically.

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";
}

这篇关于绘图 &在 Python 中渲染多路树的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆