使用pydot在Graphviz中纵向放置节点

13 投票
3 回答
13303 浏览
提问于 2025-04-15 18:59

我在Python中通过pydot使用Graphviz。我要制作的图表有很多个有向图的聚集。可是,pydot把这些聚集横着放在一起,导致生成的图片非常宽。我该怎么做才能让它输出最大宽度的图片,这样我就可以上下滚动查看了呢?

3 个回答

7

我不太确定你的数据是否能这样处理,但如果你改变节点插入图中的顺序,生成的图可能会有很大不同。如果你不想给Graphviz提供任何排序信息,并希望它自己找出节点的最佳位置以减少冲突,可以使用Graphviz的neato。它使用一种弹簧模型来决定节点应该放在哪里。

看起来你可以在pydot中这样使用neato

my_graph.write('my_graph.png', prog='neato', format='png')

你可以在这里查看pydot的文档 这里。

12

这样初始化你的图形:

graph = pydot.Dot(graph_type='digraph', rankdir='LR')

这段代码会把图形的方向设置为从左到右。一般来说,你可以查看graphviz 的文档,找到合适的属性来实现你想要的效果。

13

你可以做几件事情来调整你的图表。

  1. 你可以设置图表的最大尺寸,使用'size'这个参数(比如,size = "4, 8"(英寸))。这会固定你最终图表的大小。不同于其他节点、边和图形参数,'size'没有默认值。而且,默认的方向是'portrait'(竖向),我觉得这正是你想要的(适合高的图表而不是宽的),不过你可能想明确设置这个参数,以防之前被设置成了'landscape'(横向)。

  2. 'Size'可以和ratio参数一起使用(布局的长宽比),来调整配置。'Ratio'可以是一个浮点数(比如,ratio = "2.0")或者是'auto'或'fill'。后者的意思是让graphviz填满'size'所分配的整个图表区域。

  3. 对图表配置影响最大的参数是nodesepranksep。它们分别是相同'rank'的相邻节点之间的最小水平距离,以及相邻节点等级之间的最小垂直距离。默认值分别是0.25和0.75英寸。为了得到你想要的配置,你需要同时增加nodesep并减少ranksep。逐步调整应该能让你快速找到这两个参数的合适值,从而得到你想要的配置。

撰写回答