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

2023-12-30

NetworkX 主要用于图形分析,PyGraphviz 主要用于绘图,它们被设计为协同工作。然而,至少在一个方面,NetworkX 的图形绘制(通过 MatPlotLib)优于 PyGraphviz 的图形绘制(通过 Graphviz),即 NetworkX 具有 spring 布局算法(可通过spring_layout函数)专门用于有向图,而 PyGraphviz 有几种弹簧布局算法(可通过neato程序和其他)将有向图布置得就像无向图一样。唯一真正处理图形方向的 Graphviz / PyGraphviz 布局程序是dot, but 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')

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

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

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

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

绘制的第三个和第四个图形基本相同,但箭头不同(整个图形已旋转,但除此之外没有任何区别)。然而,第一张图和第二张图的布局不同 - 这不仅仅是因为 NetworkX 的布局算法引入了随机性元素。

反复运行上面的代码表明这不是偶然发生的。网络X的spring_layout函数显然是基于以下假设编写的:如果存在从一个节点到另一个节点的弧,则第二个节点应该比第一个节点更靠近图的中心(即,如果中描述的图edgelist有向,节点 2 应该比节点 1 和 3 更靠近节点 9,节点 6 应该比节点 4 更靠近节点 9,节点 8 应该比节点 7 更靠近节点 9;正如我们从上面第一张图中的节点 4 和 5 看到的那样,这并不总是完美地工作,但与将 2 和 9 都靠近中心相比,这是一个小问题,并且从我的角度来看,“错误”非常轻微) 。换句话说,NetworkX 的spring_layout既是等级制的又是强制导向的。

这是一个很好的功能,因为它使核心/外围结构在有向图中更加明显(其中,根据您正在使用的假设,没有传入弧的节点可以被视为外围的一部分,即使它们有大量输出弧)。 @skyebend 在下面解释了为什么大多数布局算法将有向图视为无向图,但上面的图显示 (a) NetworkX 以不同的方式对待它们,(b) 它以有助于分析的原则性方式这样做。

可以使用 PyGraphviz / Graphviz 复制吗?

不幸的是文档 http://networkx.github.com/documentation/latest/reference/generated/networkx.drawing.layout.spring_layout.html和评论的源代码 http://networkx.github.com/documentation/latest/_modules/networkx/drawing/layout.html对于 NetworkX 来说spring_layout(实际上fruchterman_reingold_layout) 函数没有提供任何线索来解释为什么 NetworkX 会产生这样的结果。

这是使用PyGraphviz使用NetworkX绘制网络的结果spring_layout函数(请参阅下面我自己对此问题的回答)。 5_pygraphviz_plus_networkx.png: (http://farm9.staticflickr.com/8378/8520231183_e7dfe21ab4.jpg http://farm9.staticflickr.com/8378/8520231183_e7dfe21ab4.jpg)


好吧,我想我已经弄清楚了,所以我要回答我自己的问题。我不认为can在 PyGraphviz 本身中完成。然而,我们可以指示 PyGraphviz 从 NetworkX 获取节点位置,但将它们固定(使用!) 所以这样neato除了对由以下方法计算的节点位置进行橡皮图章之外,程序实际上无法执行任何操作spring_layout。在上面添加以下代码行:

for k,v in pos1.iteritems():
    gvd.get_node(k).attr['pos']='{},{}!'.format(v[0]*10,v[1]*10)

gvd.layout(prog='neato')
gvd.draw('5_pygraphviz_plus_networkx.png')

结果并不完美——我必须将坐标乘以 10 才能阻止节点被绘制在彼此之上,这(显然)是一个拼凑——但它是一个改进,即具有0 入度位于外部(使用 NetworkX 布局的好处),并且有适当的箭头,不会被节点本身吞没(使用 PyGraphviz 绘图的好处)。

我知道这并不是我所要求的(即使用 PyGraphviz / Graphviz 本身的解决方案)。

如果有人能提供更好的解决方案,我会很高兴!

编辑:没有人为上面阐述的问题提供更好的解决方案,所以我将接受我自己的答案以表明它确实有效。然而,我也对 skyebend 的答案进行了投票,因为尽管它不能解决问题,但它对于理解根本问题非常有用。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

  • 用于带有嵌套子图的图的 r 包? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在寻找一个用于图形 网络的 r 包 它可以处理嵌套子图 Graphviz 做到了这一点 但只提供可
  • Flash 图表和图形的最佳解决方案是什么? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我知道融合图表 http www fusioncharts com 还有其他好的解决方案或 API 用
  • 如何在Matlab中绘制网络?

    我有一个矩阵AMatlab中的维数mx2每行包含两个节点的标签 显示网络中的直接链接 例如 如果网络有4矩阵的节点A可能A 1 2 1 3 2 1 2 4 3 2 4 1 4 2 其中第一行表示有一个链接来自1 to 2 第二行表示有一个链
  • d3力定向布局-链接距离优先

    在 d3 中使用力导向布局 如何使链接距离成为优先事项 同时仍然保持良好的图形布局 如果我指定动态链接距离 但保留默认费用 则我的图形距离会因费用函数而发生一些变形 并且不再是准确的距离 但是 如果我删除电荷 图表将如下所示 任何建议表示赞
  • 如何让 graphviz 记录的单元格对齐

    我正在 graphviz 中使用记录节点来制作一个简单的表格 但它看起来错误 digraph g node shape record height 08 node1 label DBAT 0 1 2 3 4 5 6 7 8 9 10 11
  • C# 的软件可视化

    你们中有人知道 C 中软件可视化或可视化代码导航的工具吗 我找到了很多工具 但由于某种原因它们都是针对 Java 的 维基百科中有一个列表 但没有一个是针对 Net 平台的 http en wikipedia org wiki Softwa
  • 如何计算 Postgres 上图表中所有连接的节点(行)?

    我的桌子有account id and device id One account id可以有多个device ids 反之亦然 我正在尝试计算每个连接的多对多关系的深度 Ex account id device id 1 10 1 11
  • 更改 3D 图形颜色 (matplotlib)

    我使用以下代码在 matplotlib 中绘制了 3D 图形 Previously defines lists of data to plot fig plt figure ax fig add subplot 111 projection
  • 使用 Java 进行树可视化 [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在寻找一个库来生成图形或树 例如组织图表 该库应该能够从该图中生成纯图像 有谁知道一个好的 希望开源
  • R:改变堆积条形图的颜色

    library ggplot2 df2 lt data frame supp rep c VC OJ each 3 dose rep c D0 5 D1 D2 2 len c 6 8 15 33 4 2 10 29 5 head df2 g
  • 在 GraphViz 中将多个短节点与单个高节点并行排列

    我想生成这样的东西 节点的对齐是重要的事情 而不是边缘的角度 V V lt alignment at top gt V gt lt alignment at
  • 生成和保存 ZedGraph 绘图而不在表单上显示

    是否可以将数据绘制到 ZedGraph 图表上并将其保存为文件 而不显示 生成用户可见的图表 我希望处理大量数据集并生成图表并将其保存到文件中以便在应用程序外部查看 如果无法做到这一点 是否可以在隐藏 最小化表单上显示图形 保存图形 关闭窗
  • 您将如何显示/布局企业应用程序之间的数据流?

    我的雇主是一家大型瑞士电信公司 我们有许多系统用于为不同任务传输数据 例如性能管理 故障管理 配置管理等 为了向 管理 尖头等 解释这些系统如何交互 我将有关数据流 格式 协议的信息收集到 数据库 逗号分隔的说服者 中 然后为 Graphv
  • Theano导入错误

    我正在尝试在 CPU 机器上安装 Theano 运行 intel HD 显卡 没有 NVIDIA 在 python 中测试时出现以下导入错误 WARNING theano configdefaults g not detected Thea
  • 广度优先搜索:检查访问状态的时机

    在有向图的广度优先搜索中 可能循环 当一个节点出队时 其所有尚未访问的子节点都会入队 并且该过程将继续 直到队列为空 有一次 我以相反的方式实现它 将节点的所有子节点排队 并在节点出队时检查访问状态 如果正在出队的节点之前已被访问过 则该节
  • Seaborn HeatMap - 如何在多个不同的数据集中设置颜色分级

    所以我需要在seaborn中创建许多具有不同数据规模的热图 有些范围是 0 100 有些是 100 到 100 我需要做的是保持所有图表的颜色分级相同 例如 我希望任何低于 0 的值稳定地从深蓝色变为浅蓝色 而高于 0 的值则逐渐变为深红色
  • 图中使用 K 个反向边的所有最短路径

    假设我有一个有向图 G V E 其边的权重为正整数 我需要做的是使用最多 K 整数 个反向边找到所有顶点之间的最短路径 我的意思是 如果我们在边 u 处 并且只有一条从 v 到 u 的有向边 只要我们没有在这条路径上使用 K 个反向边 我们
  • 如何在iPhone应用程序中创建折线图? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • boost::graph 算法是否能够使用以前的解决方案更快地解决密切相关的新问题?

    我在下图中定义了最大流量问题 最初 所有四个边缘的容量均为 4 个单位 我求从 0 到 3 的最大流量值 答案是 8 沿路径 0 gt 1 gt 3 4 个单位 沿路径 0 gt 2 gt 3 4 个单位 以下代码创建图表并查找最大流量 i
  • 在 X 轴刻度上渲染 HTML

    我想在 D3 图表的 x 轴上渲染 HTML 基本上 我希望轴上的每个标签都是到数据中另一列的超链接 我试过了 x domain data map function d return a href d Name a 但它根本不起作用 我得到

随机推荐