Pydot/Graphviz:如何在簇中水平排序节点,而其余部分垂直排列。

4
我的问题是在 Pydot 中,如何设置集群中节点的顺序?
我的代码是:
import pydot
graph = pydot.Dot(graph_type='digraph', rankdir="LR")
graphlegend = pydot.Cluster(graph_name="legend", label="Legend", fontsize="15", color="red", style="filled", fillcolor="lightgrey")

legend1 = pydot.Node("Sample", style="filled", fillcolor="Tomato", shape="diamond", rank="same"); graphlegend.add_node(legend1)

legend2 = pydot.Node('a', style="filled", fillcolor="LightGoldenrod", shape="Mrecord", label="Protein", rank="same"); graphlegend.add_node(legend2)

node_c = pydot.Node("ff", style="filled", fillcolor="#9ACEEB", shape="square"); graph.add_node(node_c)

graph.write_png('Sample_diagraph.png')

我希望把群集"legend"和"node_c"垂直排列,但是在"graphlegend"群集中的2个节点(legend1和legend2)水平排列。我尝试使用rank=same,但不起作用。请问你能帮忙吗?

2个回答

4

我最终通过使用一个不可见的边缘找到了替代方案

现在的代码如下:

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

graphlegend = pydot.Cluster(graph_name="legend", label="Legend", fontsize="15", color="red", style="filled", fillcolor="lightgrey", rankdir="TB")
legend1 = pydot.Node("Sample", style="filled", fillcolor="Tomato", shape="diamond", rank="same"); graphlegend.add_node(legend1)
legend2 = pydot.Node('a', style="filled", fillcolor="LightGoldenrod", shape="Mrecord", label="Protein", rank="same"); graphlegend.add_node(legend2)

graph.add_subgraph(graphlegend)

graph.add_edge(pydot.Edge(legend1, legend2, style="invis"))

通过这样做,我的图中不同的节点仍然以垂直方式组织,而水平方向上则显示了独立的群集节点,这要归功于无形边。

enter image description here


1
最可能你想要 rankdir="TB" 从上到下排列。垂直排序取决于可见或不可见边的级别。如果存在水平边,则可能需要 rank="same"

当我将rankdir="LR"替换为rankdir="TB"时,它确实使一切变得水平,但不仅限于簇。node_c也在簇的右侧。 - Jérémz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接