【问题标题】:pygraphviz 1.5 default edge no arrow?pygraphviz 1.5 默认边缘没有箭头?
【发布时间】:2019-08-07 08:04:18
【问题描述】:

我已经使用这个轮子更新到 pygraphviz 1.5 Installing pygraphviz on Windows 10 64-bit, Python 3.6

我遇到了问题。

import pygraphviz as pgv

G = pgv.AGraph()

G.add_node('a')
G.add_node('b')
G.add_edge('a', 'b')
g_string = G.string()

print(g_string)

给我

strict digraph {
    a -- b;
}

虽然之前版本 1.3 上运行的相同代码给了我

strict digraph {
    a -> b;
}

我也试过了

G.add_edge('a', 'b', arrowhead="normal") 给出a -- b [arrowhead=normal]; 但绘制时没有箭头。

我正在运行graphviz 2.38pygraphviz 1.3 在 python 2.7 上。 pygraphviz 1.5 在 python 3.6 上。

【问题讨论】:

    标签: python graphviz pygraphviz


    【解决方案1】:

    我想首先指出,为了使这个示例能够正常工作,仅仅安装 PyGraphviz 模块是不够的(检查[SO]: Installing pygraphviz on Windows 10 64-bit, Python 3.6 (@CristiFati's answer)),但是Graphviz 版本也是必需的,因为 PyGraphviz 使用其中一种工具(称为 nop)。
    它可供下载,无论如何我选择构建它(对于 32 位,但这不相关)。

    另外,我用 2 个 .whls 进行了测试:

    • 一个(我已经)为 Python 3.6(64 位)构建
    • Python 2.7(64 位)构建的一个

    由于我有可能不得不修改它们(出于调试目的),我没有pip install它们,而是将它们解压缩到 cwd 中(这需要一些额外的代码):

    [cfati@CFATI-5510-0:e:\Work\Dev\StackOverflow\q055196206]> dir /b
    code00.py
    pygraphviz131_27
    pygraphviz15_36
    
    [cfati@CFATI-5510-0:e:\Work\Dev\StackOverflow\q055196206]> tree /a
    Folder PATH listing for volume Work
    Volume serial number is 3655-6FED
    E:.
    +---pygraphviz131_27
    |   \---pygraphviz
    |       \---tests
    \---pygraphviz15_36
        \---pygraphviz
            \---tests
    

    code00.py

    #!/usr/bin/env python3
    
    import sys
    
    
    # @TODO - cfati: The 5 lines below are because I unpacked the 2 `.whl`s in the current dir, instead of `pip install`ing them
    maj, min = sys.version_info[:2]
    if maj == 3 and min == 6:
        sys.path.insert(0, "pygraphviz15_36")
    elif maj == 2 and min == 7:
        sys.path.insert(0, "pygraphviz131_27")
    # @TODO end
    
    import pygraphviz as pgv
    
    
    def main():
        print(pgv)
        g = pgv.AGraph(directed=len(sys.argv) > 1)
        g.add_node("a")
        g.add_node("b")
        g.add_edge("a", "b")
        #print(dir(g))
        g_string = g.string()  # Nice var name, btw :)
        print(g_string)
    
    
    if __name__ == "__main__":
        print("Python {:s} on {:s}\n".format(sys.version, sys.platform))
        main()
    

    输出

    [cfati@CFATI-5510-0:e:\Work\Dev\StackOverflow\q055196206]> set PATH=%PATH%;e:\Work\Dev\Fati\WinBuild\graphviz\src\graphviz\Release\Graphviz\bin
    
    [cfati@CFATI-5510-0:e:\Work\Dev\StackOverflow\q055196206]> "e:\Work\Dev\VEnvs\py_064_02.07.15_test0\Scripts\python.exe" code00.py
    Python 2.7.15 (v2.7.15:ca079a3ea3, Apr 30 2018, 16:30:26) [MSC v.1500 64 bit (AMD64)] on win32
    
    <module 'pygraphviz' from 'pygraphviz131_27\pygraphviz\__init__.pyc'>
    strict digraph {
            a -> b;
    }
    
    
    [cfati@CFATI-5510-0:e:\Work\Dev\StackOverflow\q055196206]> "e:\Work\Dev\VEnvs\py_064_03.06.08_test0\Scripts\python.exe" code00.py
    Python 3.6.8 (tags/v3.6.8:3c6b436a57, Dec 24 2018, 00:16:47) [MSC v.1916 64 bit (AMD64)] on win32
    
    <module 'pygraphviz' from 'pygraphviz15_36\\pygraphviz\\__init__.py'>
    strict graph "" {
            a -- b;
    }
    

    正如所见,问题很容易重现。现在,输出 -- vs. -> 看起来 非常糟糕很多关于我如何表示无向 vs. 有向图边。我查看了源代码,发现了一些奇怪的东西。

    [GitHub.PyGraphviz 1.5]: class AGraph(thing=None, filename=None, data=None, string=None, handle=None, name='', strict=True, directed=False, **attr) 具有 directed=False 参数。将其设置为 True,解决了问题。

    输出

    [cfati@CFATI-5510-0:e:\Work\Dev\StackOverflow\q055196206]> "e:\Work\Dev\VEnvs\py_064_02.07.15_test0\Scripts\python.exe" code00.py dummy_arg
    Python 2.7.15 (v2.7.15:ca079a3ea3, Apr 30 2018, 16:30:26) [MSC v.1500 64 bit (AMD64)] on win32
    
    <module 'pygraphviz' from 'pygraphviz131_27\pygraphviz\__init__.pyc'>
    strict digraph {
            a -> b;
    }
    
    
    [cfati@CFATI-5510-0:e:\Work\Dev\StackOverflow\q055196206]> "e:\Work\Dev\VEnvs\py_064_03.06.08_test0\Scripts\python.exe" code00.py dummy_arg
    Python 3.6.8 (tags/v3.6.8:3c6b436a57, Dec 24 2018, 00:16:47) [MSC v.1916 64 bit (AMD64)] on win32
    
    <module 'pygraphviz' from 'pygraphviz15_36\\pygraphviz\\__init__.py'>
    strict digraph "" {
            a -> b;
    }
    

    我说我发现了一些奇怪的东西:嗯,对于 PyGraphviz 1.3.1 事情是一样的directed=False(代码 和 doc),但它以某种方式初始化图按照它的指示
    agraph.py 的快速检查(在 2 个软件包版本上)并未揭示这种差异的来源,因此我可以放心地假设这是因为 Graphviz 构建 2 个 PyGraphviz 版本的软件包版本。

    尽管如此,PyGraphviz 1.5(由我构建)行为是正确的

    【讨论】:

    • 不客气!我已经了解了 PyGraphviz。我将不得不更新另一个问题,包括一些(我猜大部分)场景也需要 Graphviz 的事实。另外,我更改了 GitHub 存储库名称,目前正在编辑其他问题,完成后将包含最新信息。
    【解决方案2】:

    作为文档state,默认情况下 AGraph 是无向的。您必须在图形构建期间指定 directed=True 属性:

    >>> G = pgv.AGraph(directed=True)
    >>> G.add_node('a')
    >>> G.add_node('b')
    >>> G.add_edge('a', 'b')
    >>> g_string = G.string()
    >>>
    >>> print(g_string)
    strict digraph "" {
        a -> b;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-19
      • 2016-12-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多