如何在pygraphviz中创建无向图?

5

我正在尝试在pygraphviz中生成无向图,但一直没有成功。无论我做什么,图形似乎总是有向的。

Example #1
G = pgv.AGraph(directed=False)
G.is_directed()  # true

Example #2
G = pgv.AGraph()
G.to_undirected().is_directed()  # True

Example #3
G = pgv.AGraph(directed=False)
G.graph_attr.update(directed=False)
G.is_directed()  # true

我不知道为什么这么微不足道的事情不能正常工作。我做错了什么吗?

你发布的示例对我来说运行良好。你使用的pygraphviz版本是什么? - Maehler
1
我正在使用1.1版本,它完美地运行着。真是奇怪的行为,不知道还能说什么。 - Maehler
3个回答

2
我在pygraphviz 1.2上遇到了同样的问题,但我有一个解决方法。
如果你使用DOT语言指定所需的图形类型为空图(例如graph foo {}),并将其传递给AGraph的构造函数,则pygraphviz将尊重图形类型,即使在关键字参数中忽略它(如在我的环境中)。
>>> import pygraphviz as pgv
>>> foo = pgv.AGraph('graph foo {}')
>>> foo.is_directed()
False
>>> foo.add_edge('A', 'B')
>>> print foo
graph foo {
        A -- B;
}

这个解决方法对于 strict 参数同样有效,在我的环境中也被忽略了。
使用以下函数代替 pgv.AGraph,以获得相同的 API:
def AGraph(directed=False, strict=True, name='', **args):
    """Fixed AGraph constructor."""

    graph = '{0} {1} {2} {{}}'.format(
        'strict' if strict else '',
        'digraph' if directed else 'graph',
        name
    )

    return pgv.AGraph(graph, **args)

感谢您修复这个棘手的错误!它应该被包含在pygraphviz库中。请将显示名称设置为您的答案作为解决方案! - sol

1

对于Python 3.6.8和graphviz==0.11.1版本,使用简单的Graph()函数即可。

from graphviz import *
dot = Graph()
dot.node('1', 'King Arthur')
dot.node('2', 'Sir Bedevere the Wise')
dot.node('3', 'Sir Lancelot the Brave')

dot.edges(['12', '13', '23'])

dot.render(view=True)

-2

解决方案1:

尝试像这样链接节点: a -- b

而不是像这样链接:

a -> b

解决方案2: edge[dir=none]

不确定这些是否对您有帮助,因为我已经很久没有使用graphviz并且忘记了它的语法。也可以查看这个链接,应该很容易理解:http://en.wikipedia.org/wiki/DOT_language


这个问题涉及到pygraphviz,语法与“dot”的语法不同。 - Maehler
这帮助我找到了如何轻松绘制没有边缘的箭头的方法。 - Elia Perantoni

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