让 pygraphviz 簇相互指向? (并正确渲染。)

问题描述 投票:0回答:1

我看过一些帖子谈论这类事情,例如herehere,但我重新创建了graphviz规范,但它的渲染效果并不相同。特别是,当箭头应该从簇边缘开始并指向节点时,它会在该边缘处消失,并且只有头部出现在该节点处。

这是代码:

G = nx.DiGraph(name='G')
G.add_nodes_from(['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'])
A = to_agraph(G, compound=True)

cluster0 = A.add_subgraph(['a', 'b', 'c', 'd'], name='cluster0')
cluster1 = A.add_subgraph(['e', 'f', 'g'], name='cluster1')

cluster0.add_edges_from([('a', 'b'), ('a', 'c'), ('b', 'd'), ('c', 'd')])
cluster1.add_edges_from([('e', 'g'), ('e', 'f')])

A.add_edges_from([('c', 'e'), ('b', 'f'), ('c', 'g'), ('d', 'h')])#, ('d', 'e'), ])
A.get_edge('c', 'e').attr.update({'ltail': 'cluster0'})

产生:

strict digraph G {
    graph [compound=True,
        name=G
    ];
    subgraph cluster1 {
        e -> f;
        e -> g;
    }
    subgraph cluster0 {
        a -> b;
        a -> c;
        b -> d;
        c -> d;
    }
    b -> f;
    c -> e  [ltail=cluster0];
    c -> g;
    d -> h;
}

为了渲染 AGraph,我这样做:

A.layout(prog='dot')
png_str = A.draw(format='png', prog='dot', args=f"-Gdpi={DPI}")
sio = BytesIO(png_str)
img = mpimg.imread(sio)
plt.imshow(img)
plt.axis('off')
plt.show()

呈现为:

Broken Arrow

去掉ltail=cluster0属性(

#A.get_edge('c', 'e').attr.update({'ltail': 'cluster0'})
),图像出来了:

Full Arrow

我做错了什么? (如果在向我展示我做错了什么时,您还显示了一个箭头,其尾部从两个嵌套簇内部的边界开始并指向最外层簇的外部,那就是巨大的加分。)

python graphviz dot pygraphviz
1个回答
0
投票

好消息、坏消息和(也许)好消息。
好消息:生成的 dot 输入没有任何问题。
坏消息:您遇到了这个错误(https://gitlab.com/graphviz/graphviz/-/issues/2447
好消息:它似乎已在最新版本中修复。此版本(点-graphviz版本10.0.0~dev.20240113.0503(20240113.0503))制作:

(抱歉,不太明白你的“奖励积分”问题)

© www.soinside.com 2019 - 2024. All rights reserved.