Python中节点图的ASCII可视化
我有一个叫做 Node 的类。
class Node:
def __init__(self,name, childList, parentList):
self.name = name
# a list of all nodes which are children of this node
# may have length 0 to many
self.childList = childList
# a list of all nodes which are parents of this node
# may have length 0 to many
self.parentList = parentList
我有一个 Node 的列表(nodeList)。这些 Node 可能在彼此的父列表(parentLists)或子列表(childLists)中。我想把这些 Node 之间的关系,用 ASCII 图形的方式显示出来,输出到屏幕上。
比如,下面的名字都是 nodeList 中 Node 的名字。
Classifier
|
|
FeatureCombiner
/ \
/ \
/ \
FeatureGenerator1 FeatureGenerator2
\ /
\ /
\ /
\ /
\ /
\ /
\ /
Image Loader
Classifier 有一个空的父列表和一个长度为 1 的子列表,里面包含 FeatureCombiner。FeatureGenerator1 和 FeatureGenerator2 有相同的父列表,子列表分别包含 FeatureCombiner 和 Image Loader。Image Loader 有一个空的子列表,父列表包含 FeatureGenerator1 和 FeatureGenerator2。
提前谢谢你,
Matt
3 个回答
也许可以把Perl语言中Graph::Easy
这个库的ASCII图形布局逻辑移植过来?
我们在DVC项目中遇到了类似的问题。我们尝试过把Graph::Easy移植到Python,但发现没有一个跨平台的Python库可以做到这一点,而且还不需要像Graphviz那样的复杂依赖。所以最后我们选择了一个很棒的库,叫做Grandalf,它帮我们处理了布局。然后我们自己用ASCII格式渲染结果,并通过一个分页工具展示出来(这就像git log
那样,让输出既美观又可以上下左右滚动)。完整代码可以在这里查看。
+-------------------+ +--------------------+
| test_data.csv.dvc | | train_data.csv.dvc |
+-------------------+ +--------------------+
** **
*** ***
** **
+-------------------+
| featurization.dvc |
+-------------------+
*** ***
** ***
** **
+--------------+ **
| training.dvc | **
+--------------+ ***
*** ***
** **
** **
+---------+
| Dvcfile |
+---------+
用ASCII字符来画图其实挺复杂的,这从下面这个链接的回答数量就能看出来:
不过,市面上有很多工具可以用其他方式来画图。比如,你可以先看看NetworkX和Matplotlib这两个库的绘图功能:
http://matplotlib.sourceforge.net/
还有pydot这个工具: