需要控制pydot边的长度

2024-05-17 13:46:27 发布

您现在位置:Python中文网/ 问答频道 /正文

有没有一种方法可以使用pydot来生成一个看起来像“普通树图”的有向树图,其中具有相同深度的每个节点都显示在相同的深度上,并且每条边都处于某个角度(而不是直下)?在

当我使用这些默认值时:

graph = pydot.Dot(graph_type='digraph', nodesep=.75)
graph.set_node_defaults(style="filled", fillcolor="grey")
graph.set_edge_defaults(color="blue", arrowhead="vee", weight="0")

节点2和1之间的边的长度太长。请参见:
enter image description here

我可以使用边权重“1”校正节点的长度,例如:

graph.set_edge_defaults(color="blue", arrowhead="vee", weight="1")

但现在有两条边指向2和3,7和6之间。参见: enter image description here

事实证明,笔直向下的边是一个真正的问题。如果没有绘制左同级节点和右同级节点,则不清楚绘制了哪个节点(左节点或右节点)。在

PS:在我上一个关于这个项目的问题中,我问过如何控制边的角度,这样pydot生成的树图将避免边直接指向下。“盖伊”很好地回答了这个问题。在使用不可见节点实现Guy的解之后,出现了一个新的副作用:一些图上某些边的长度过长。以下是上一个问题的链接供参考:Is there a way to control line angle when producing graphs with pyDot


Tags: 节点树图绘制bluegraphcolor指向角度
1条回答
网友
1楼 · 发布于 2024-05-17 13:46:27

要正确地控制pydot有向图的节点位置和边长度,以便边在指向同一方向时彼此平行,没有任何边指向正下方,并且所有节点都绘制到相应的级别-必须使用不可见的节点。在

在上一个主题为“如何控制线角度…”的SO Q/A会话中,我了解到不可见节点用于填充缺失的叶节点。这对一些树有效,但也有一些副作用。在

现在,我已经学会了向每个包含左节点和右节点的节点添加第三个不可见节点。请注意,不可见节点不会添加到树中,而只是绘制到图形中。因此,树仍然可以用于搜索、插入、删除和其他方法。在

下面是一个graphviz示例,演示解决方案:

digraph {
  nodesep=0.35
  ordering=out
  node[style="filled", fillcolor="grey"]
  edge[color="blue", arrowhead="vee"]
  { node[shape=point style=invis] m5 m2 m8 m6 m4 }

  5 ->  2
  5 ->  m5 [weight=100 style=invis]
  5 ->  8
  2 -> 1
  2 -> m2 [weight=100 style=invis]
  2 -> 4
  8 -> 6
  8 -> m8 [weight=100 style=invis]
  4 -> 3
  4 -> m4 [weight=100 style=invis]
  6 -> m6 [weight=100 style=invis]
  6 ->  7
}

下面是我更新的python代码片段,它使用一个典型的树类自动执行此过程:

^{pr2}$

完整的源代码可以在项目所在地找到:http://www.embeddedcomponents.com/blogs/2013/12/visualizing-software-tree-structures/

典型的小图像现在开始按我的要求绘制:binary search tree

甚至可以用相似的几何图形绘制大树:larger binary search tree with ordered search trail

相关问题 更多 >