如何在pygraphviz中创建无向图?

时间:2013-01-17 07:50:50

标签: python graphviz pygraphviz

我试图在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

我不知道为什么这么简单的事情无法发挥作用。我做错了什么?

4 个答案:

答案 0 :(得分:2)

我在pygraphviz 1.2上遇到了同样的问题,但我有一个解决方法。

如果使用DOT language(例如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)

答案 1 :(得分:0)

对于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)

可能存在旧问题,但由于缺少答案,我将尝试提供一种调试方法。 为了生成无向图,您在代码方面做得正确。明显。

def is_directed(self):
    """Return True if graph is directed or False if not."""
    if gv.agisdirected(self.handle) == 1:
        return True
    else:
        return False

来自agraph.py

一个想法是在该函数上设置一个断点,然后检查变量。 这假定您提供的代码是唯一涉及的代码。

您也可以尝试使用virtualenv并设置新环境,或者在另一台机器上进行测试。这可能是显而易见的。

答案 3 :(得分:-2)

解决方案1:

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

而不是这样:

a - > B'/ P>

解决方案2: 边缘[DIR =无]

不确定这些是否对您有所帮助,因为我已经使用了graphviz很长一段时间而忘记了它的语法。看看这个,应该很容易理解:http://en.wikipedia.org/wiki/DOT_language