Python中节点图的ASCII可视化

18 投票
3 回答
8809 浏览
提问于 2025-04-16 14:16

我有一个叫做 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 个回答

5

也许可以把Perl语言中Graph::Easy这个库的ASCII图形布局逻辑移植过来?

11

我们在DVC项目中遇到了类似的问题。我们尝试过把Graph::Easy移植到Python,但发现没有一个跨平台的Python库可以做到这一点,而且还不需要像Graphviz那样的复杂依赖。所以最后我们选择了一个很棒的库,叫做Grandalf,它帮我们处理了布局。然后我们自己用ASCII格式渲染结果,并通过一个分页工具展示出来(这就像git log那样,让输出既美观又可以上下左右滚动)。完整代码可以在这里查看

+-------------------+           +--------------------+
| test_data.csv.dvc |           | train_data.csv.dvc |
+-------------------+           +--------------------+
                  **              **                  
                    ***        ***                    
                       **    **                       
                +-------------------+                 
                | featurization.dvc |                 
                +-------------------+                 
                  ***            ***                  
                **                  ***               
              **                       **             
    +--------------+                     **           
    | training.dvc |                   **             
    +--------------+                ***               
                  ***            ***                  
                     **        **                     
                       **    **                       
                     +---------+                      
                     | Dvcfile |                      
                     +---------+                      
8

用ASCII字符来画图其实挺复杂的,这从下面这个链接的回答数量就能看出来:

Python ASCII图形绘制

不过,市面上有很多工具可以用其他方式来画图。比如,你可以先看看NetworkX和Matplotlib这两个库的绘图功能:

http://networkx.lanl.gov/

http://matplotlib.sourceforge.net/

还有pydot这个工具:

http://code.google.com/p/pydot/

撰写回答