我看过一些帖子谈论这类事情,例如here和here,但我重新创建了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()
呈现为:
去掉ltail=cluster0属性(
#A.get_edge('c', 'e').attr.update({'ltail': 'cluster0'})
),图像出来了:
我做错了什么? (如果在向我展示我做错了什么时,您还显示了一个箭头,其尾部从两个嵌套簇内部的边界开始并指向最外层簇的外部,那就是巨大的加分。)
好消息、坏消息和(也许)好消息。
好消息:生成的 dot 输入没有任何问题。
坏消息:您遇到了这个错误(https://gitlab.com/graphviz/graphviz/-/issues/2447)
好消息:它似乎已在最新版本中修复。此版本(点-graphviz版本10.0.0~dev.20240113.0503(20240113.0503))制作:
(抱歉,不太明白你的“奖励积分”问题)