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 …
我正在使用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) 我正在使用 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的颜色,可以很容易地将它与其他标签区分开来,这是我无法完成的。
我使用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图并为其添加标签
该示例在网站上给出,但是没有提及如何使用词典设置颜色。
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?
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)
产生
这是由于结肠.
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文件的第二个脚本)
有人有想法吗?
对于上面的图像,使用的AdaBoostClassifier库scipy,graphviz我能够创建此子树视觉效果,我需要帮助来解释每个节点中的值吗?例如,“ 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) 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 中的networkx 库打印二叉树。
\n\n可是,我却无法保住左右两个孩子。有没有办法告诉图表先打印左孩子,然后打印右孩子?
\n\nimport networkx as nx\nG = nx.Graph()\nG.add_edges_from([(10,20), (11,20)])\nnx.draw_networkx(G)\nRun Code Online (Sandbox Code Playgroud)\n\n\n\n编辑1:使用 pygraphwiz 时,它至少会产生一个有向图。所以,我对根节点有了更好的了解。
\n\n下面是我正在使用的代码:
\n\nimport 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\')\nRun Code Online (Sandbox Code Playgroud)\n\n但是,这距离结构化格式还很远。接下来我将发布我发现的内容。新图如下所示(至少我们知道根):
\n\n\n\n编辑2:对于那些遇到安装问题的人,请参阅这篇文章。 答案是——如果你想在 Windows 64 位上安装 pygraphviz,它非常有帮助。
\n我试图在我的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) 我正在阅读一个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)
图表很复杂,但我真的更喜欢边缘不跨越节点.我试过,当我设置严格和重叠时,但我仍然有越过节点的线.
这似乎是人们会碰到的东西,但我找不到任何东西.我可能做了一些完全错误的事情,或使用了错误的搜索词.任何帮助赞赏.
为了安装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 ×12
python ×9
graphviz ×6
networkx ×5
python-2.7 ×4
graph ×2
binary-tree ×1
scikit-learn ×1
scipy ×1
tree ×1