标签: pygraphviz

Graphviz/PyGraphviz中有向图的NetworkX风格弹簧模型布局

NetworkX主要用于图形分析,PyGraphviz主要用于绘图,它们旨在协同工作.然而,至少有一个方面,NetworkX的图形绘制(通过MatPlotLib)优于PyGraphviz的图形绘制(通过Graphviz),即NetworkX具有弹簧布局算法(可通过spring_layout函数访问)专门用于有向图,而PyGraphviz有几个弹簧布局算法(可通过neato程序和其他方法访问),将有向图布置为无向图.真正处理图形中方向的唯一Graphviz/PyGraphviz布局程序是dot,但dot创建分层布局,而不是强制定向布局.

下面是一个示例,显示了有向图的弹簧布局的NetworkX和PyGraphviz之间的区别:

import networkx as nx
import pygraphviz as pgv
import matplotlib.pyplot as ppt

edgelist = [(1,2),(1,9),(3,2),(3,9),(4,5),(4,6),(4,9),(5,9),(7,8),(7,9)]

nxd = nx.DiGraph()
nxu = nx.Graph()
gvd = pgv.AGraph(directed=True)
gvu = pgv.AGraph()

nxd.add_edges_from(edgelist)
nxu.add_edges_from(edgelist)
gvd.add_edges_from(edgelist)
gvu.add_edges_from(edgelist)

pos1 = nx.spring_layout(nxd)
nx.draw_networkx(nxd,pos1)
ppt.savefig('1_networkx_directed.png')
ppt.clf()

pos2 = nx.spring_layout(nxu)
nx.draw_networkx(nxu,pos2)
ppt.savefig('2_networkx_undirected.png')
ppt.clf()

gvd.layout(prog='neato')
gvd.draw('3_pygraphviz_directed.png')

gvu.layout(prog='neato')
gvu.draw('4_pygraphviz_undirected.png')
Run Code Online (Sandbox Code Playgroud)

1_networkx_directed.png :( http://farm9.staticflickr.com/8516/8521343506_0c5d62e013.jpg)

2_networkx_undirected.png :( http://farm9.staticflickr.com/8246/8521343490_06ba1ec8e7.jpg)

3_pygraphviz_directed.png :( http://farm9.staticflickr.com/8365/8520231171_ef7784d983.jpg)

4_pygraphviz_undirected.png :( http://farm9.staticflickr.com/8093/8520231231_80c7eab443.jpg)

绘制的第三和第四个数字基本相同,但对于箭头(整个数字已经旋转,但除此之外,没有区别).然而,第一和第二个数字的布局不同 - 而且不仅仅是因为NetworkX的布局算法引入了随机元素.

重复运行上面的代码表明这不是偶然发生的.NetworkX的spring_layout功能显然是假设如果从一个节点到另一个节点存在弧,第二个节点应该比第一个节点更接近图的中心(即,如果描述的图edgelist …

visualization graph graphviz networkx pygraphviz

3
推荐指数
1
解决办法
6688
查看次数

如何在PyGraphviz中创建重复的节点?

我正在使用PyGraphviz绘制二叉搜索树.我无法使用PyGraphviz创建重复节点,因为边缘循环回节点.

例如,以下代码仅生成5个节点,从而省略了重复的节点.我尝试使用唯一索引标记每个节点,但这不能解决问题.

import pygraphviz as pgv
tree = pgv.AGraph(directed=True, strict=True)
tree.add_node(2)
tree.add_node(3)
tree.add_node(1)
tree.add_node(7)
tree.add_node(3)
tree.add_node(9)
tree.add_node(2)
tree.write('foo.dot')
image = pgv.AGraph('foo.dot')
image.layout()
image.draw('foo.pdf')
image.close()
Run Code Online (Sandbox Code Playgroud)

重复节点丢失

我的代码绘制到BST:

import pygraphviz as pgv
import random


class Node:
    insertion_step = []

    def __init__(self, data):
        self.data = data
        self.left = None
        self.right = None

    def addNode(self, data):
        if data < self.data:
            if self.left is None:
                self.left = Node(data)
                self.printSubtree()
            else:
                self.left.addNode(data)  # recursively calling addNode method
        else:
            if self.right is None:
                self.right = Node(data)
                self.printSubtree()
            else: …
Run Code Online (Sandbox Code Playgroud)

binary-tree graphviz python-2.7 pygraphviz

3
推荐指数
1
解决办法
2201
查看次数

Pygraphviz xlabel位置和颜色不起作用

我正在使用 pygraphviz 为我的项目创建图表。我无法弄清楚如何使节点的 xlabel 居中以及如何更改 xlabel 的颜色。

graph.add_node(row[3], color='goldenrod2', style='filled', shape='box',
                           xlabel=round(self.pi_dict.get(row[3]), 2), fontname='calibri')
Run Code Online (Sandbox Code Playgroud)

我尝试使用xlp='10,10!'xlabelfontcolor='red'。这两个属性似乎都不起作用。我哪里错了。

在此输入图像描述

正如您在附图中所看到的。上面,xlabel 默认位于节点的左角。另外,通过改变xlabel的颜色,可以很容易地将它与其他标签区分开来,这是我无法完成的。

python graphviz networkx python-2.7 pygraphviz

3
推荐指数
1
解决办法
2363
查看次数

Python,pygraphviz,networkx

我使用networkx构建了一个有向加权图,我可以绘制它,但即使图形非常小,它也经常交叉边.我也使用pygraphviz,但我无法添加标签.有人可以帮助我吗?

   edge_labels=dict([((u,v,),d['weight'])
              for u,v,d in DG.edges(data=True)])
   pylab.figure(1)
   pos=nx.spring_layout(DG)

   nx.draw(DG, pos)
   nx.draw_networkx_edge_labels(DG,pos,edge_labels=result,font_size=10)

   pylab.show()
Run Code Online (Sandbox Code Playgroud)

如何将其转换为pygraphviz图并为其添加标签

python networkx pygraphviz

3
推荐指数
1
解决办法
3654
查看次数

在pyGraphViz中设置节点的颜色

该示例在网站上给出,但是没有提及如何使用词典设置颜色。

import pygraphviz as pgv
d={'1': {'2': None}, '2': {'1': None, '3': None}, '3': {'2': None}}
A=pgv.AGraph(d)
Run Code Online (Sandbox Code Playgroud)

通过AGraph初始化后,是否应该使用get_node?

python python-2.7 pygraphviz

3
推荐指数
1
解决办法
1517
查看次数

当输入节点有冒号时,nx.write_dot(...)会生成冗余节点

import networkx as nx

G = nx.DiGraph()
G.add_edge("A: test", 'B: test')

nx.write_dot(G,'so.dot')
Run Code Online (Sandbox Code Playgroud)

产生

http://oi67.tinypic.com/2hrzrx3.jpg

这是由于结肠.

so.dot:

strict digraph G {
A;
B;
"A: test" -> "B: test";
}
Run Code Online (Sandbox Code Playgroud)

请注意,它会剥离冒号及其后面的所有内容.

如果我手动将其更改为

strict digraph G {
"A: test";
"B: test";
"A: test" -> "B: test";
}
Run Code Online (Sandbox Code Playgroud)

没关系.事实上,只要存在边缘,是否存在节点并不重要.

如果删除之间的空间:t,仅A和B被生成.

我试过以各种方式逃避冒号,但这似乎不起作用.显然,我每次都可以手动删除节点,但脚本解决方案更可取.(而不是通过.dot文件的第二个脚本)

有人有想法吗?

python graphviz networkx pygraphviz

3
推荐指数
1
解决办法
361
查看次数

graphviz在决策树的每个节点内呈现的值是什么意思?

在此处输入图片说明

对于上面的图像,使用的AdaBoostClassifier库scipygraphviz我能够创建此子树视觉效果,我需要帮助来解释每个节点中的值吗?例如,“ gini”是什么意思?“样本”和“值”字段的意义是什么?属性F5 <= 0.5是什么意思?

这是我的代码(我在jupyter笔记本中全部完成了此操作):

import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
import seaborn as sns
%matplotlib inline

f = open('dtree-data.txt')
d = dict()
for i in range(1,9):
    key = 'F' + str(i)
    d[key] = []
d['RES'] = []
for line in f:
    values = [(True if x == 'True' else False) for x in line.split()[:8]]
    result = line.split()[8]
    d['RES'].append(result)
    for i in range(1, 9):
        key = 'F' + str(i)
        d[key].append(values[i-1]) …
Run Code Online (Sandbox Code Playgroud)

python scipy pygraphviz scikit-learn

3
推荐指数
1
解决办法
2895
查看次数

如何使用PyGraphviz在无向图的边缘上添加和显示权重?

import pygraphviz as pgv
A = pgv.AGraph()
A.add_node('Alice')
A.add_node('Emma')
A.add_node('John')
A.add_edge('Alice', 'Emma')
A.add_edge('Alice', 'John')
A.add_edge('Emma', 'John')
print A.string()
print "Wrote simple.dot"
A.write('simple.dot')  # write to simple.dot
B = pgv.AGraph('simple.dot')  # create a new graph from file
B.layout()  # layout with default (neato)
B.draw('simple.png')  # draw png
print 'Wrote simple.png'
Run Code Online (Sandbox Code Playgroud)

我想在边缘添加权重,这也应该显示在图上.

python graphviz python-2.7 pygraphviz

2
推荐指数
1
解决办法
5571
查看次数

使用networkx打印python图表时保留左右孩子

我正在尝试使用 python 中的networkx 库打印二叉树。

\n\n

可是,我却无法保住左右两个孩子。有没有办法告诉图表先打印左孩子,然后打印右孩子?

\n\n
import networkx as nx\nG = nx.Graph()\nG.add_edges_from([(10,20), (11,20)])\nnx.draw_networkx(G)\n
Run Code Online (Sandbox Code Playgroud)\n\n

在此输入图像描述\n\xef\xbf\xbc

\n\n

编辑1:使用 pygraphwiz 时,它至少会产生一个有向图。所以,我对根节点有了更好的了解。

\n\n

下面是我正在使用的代码:

\n\n
import pygraphviz as pgv\nG = pgv.AGraph()\nG.add_node(\'20\')\nG.add_node(\'10\')\nG.add_node(\'11\')\nG.add_edge(\'20\',\'10\')\nG.add_edge(\'20\',\'11\')\nG.add_edge(\'10\',\'7\')\nG.add_edge(\'10\',\'12\')\n\nG.layout()\nG.draw(\'file1.png\')\nfrom IPython.display import Image\nImage(\'file1.png\')\n
Run Code Online (Sandbox Code Playgroud)\n\n

但是,这距离结构化格式还很远。接下来我将发布我发现的内容。新图如下所示(至少我们知道根):

\n\n

根到叶二叉树

\n\n

编辑2:对于那些遇到安装问题的人,请参阅这篇文章。 答案是——如果你想在 Windows 64 位上安装 pygraphviz,它非常有帮助。

\n

python tree graph networkx pygraphviz

2
推荐指数
1
解决办法
3013
查看次数

在Windows 7上安装了pygraphviz,但无法导入它; 找不到_graphviz

我试图在我的64位Windows 7 SP1安装上安装pygraphviz.python setup.py install通过更正setup.py文件的以下行,我能够获得通常的命令:

include_dirs = r"C:\Program Files (x86)\Graphviz2.38\include"
library_dirs = r"C:\Program Files (x86)\Graphviz2.38\lib\release\lib"
Run Code Online (Sandbox Code Playgroud)

但是,当我尝试导入它时,我收到以下错误:

Python 2.7.3 (default, Apr 10 2012, 23:31:26) [MSC v.1500 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import pygraphviz
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "pygraphviz\__init__.py", line 58, in <module>
    from .agraph import AGraph, Node, Edge, Attribute, ItemAttribute
  File "pygraphviz\agraph.py", line 26, in <module>
    from . import …
Run Code Online (Sandbox Code Playgroud)

python graphviz pygraphviz

1
推荐指数
1
解决办法
3074
查看次数

防止边缘穿过pygraphviz中的节点

我正在阅读一个JSON文件并使用pygraphviz动态创建一个图形,使用一个简单的循环:

hostdata = []
nodes = []
edges = {}
current_host = ""
trial = pgv.AGraph(strict=False, overlap=False)
for filename in os.listdir(options.directory):
    with open(options.directory + "/" + filename, "r") as myfile:
        hostdata = Truth(myfile.read().replace('\n', ''))
    nodes.append(hostdata.host["something"])
    current_something = hostdata.host["something"]
    for key, value in hostdata.peer.iteritems():
        nodes.append(key)
        edges[current_something] = key
        trial.add_edge(current_host, key)
Run Code Online (Sandbox Code Playgroud)

图表很复杂,但我真的更喜欢边缘不跨越节点.我试过,当我设置严格和重叠时,但我仍然有越过节点的线.

带有交叉节点的图形

这似乎是人们会碰到的东西,但我找不到任何东西.我可能做了一些完全错误的事情,或使用了错误的搜索词.任何帮助赞赏.

python pygraphviz

1
推荐指数
1
解决办法
1048
查看次数

在 google colab 中安装 pygrahviz

为了安装graphviz,可以按照这个例子:https : //colab.research.google.com/drive/1_Qb92Hj5_f2rpta67JC0JKXwE2581Ar-#scrollTo=BOa9gIcDo6GS

当我尝试安装pygraphviz(https://pygraphviz.github.io/通过)(https://pypi.org/project/pygraphviz/

!pip install pygraphviz
import pygraphviz as pgv
Run Code Online (Sandbox Code Playgroud)

我得到了错误

ERROR: Failed building wheel for pygraphviz
Run Code Online (Sandbox Code Playgroud)

虽然我之前安装了graphviz。为什么?

pygraphviz google-colaboratory

1
推荐指数
2
解决办法
1658
查看次数