使用 python 和 networkx 进行大图可视化

Posted

技术标签:

【中文标题】使用 python 和 networkx 进行大图可视化【英文标题】:large graph visualization with python and networkx 【发布时间】:2013-06-27 04:32:18 【问题描述】:

我在 python 和 networkx 中的大型图形可视化方面遇到了问题。该图希望可视化是有向的,并且边缘和顶点集大小为 215,000 从文档(链接在首页)很明显 networkx 支持使用matplotlib 和 GraphViz 进行绘图。在matplotlib和networkx中绘制如下:

import 
networkx as nx
import matplotlib.pyplot as plt
#Let g be a graph that I created
nx.draw(g)

nx.draw(g) 之后出现内存错误,之后您通常会执行plt.show() 或 plt.[some_function] 以将文件保存为高效格式等。

接下来我尝试了 GraphViz。从wikipedia page dot 格式用于有向图,我创建了一个点文件:

nx.write_dot(g, "g.dot")

这很好,我在当前目录中有一个 12 兆字节的点文件。接下来我运行了dot 程序(graphviz 的一部分,用于创建后记文件):

dot -Tps g.dot -o g.ps

这会降低我的计算机速度,运行几分钟,然后在终端中显示 Killed。所以它永远无法执行......在阅读 graphviz 的文档时,似乎只支持无向图用于大型图形可视化。

问题: 通过这两次不成功的尝试,谁能告诉我如何使用 python 和 networkx 来可视化我的大图,其中包含大约 215,000 个顶点和 215,000 个边?我怀疑与 Graphviz 一样,我将不得不输出为中间格式(尽管这不应该那么难,它不会像内置函数那样简单),然后使用另一个工具来读取中间格式,然后输出可视化.

所以,我正在寻找以下内容:

    从 networkx 输出图形到中间格式 使用新的包/软件/工具(最好是 python-interactive)读取中间格式并可视化大图

如果您需要更多信息,请告诉我!

【问题讨论】:

想象一下,您成功地创建了这张大图的 PostScript 图像。你会用它做什么?假设您花了 10 秒时间查看每个节点。检查整个图表需要将近 25 天的时间。在我看来,您需要某种方法来“放大”感兴趣的子图,而不是显示整个事物(作为一个 PostScript 图像)。 我想知道我的图表是什么样子的。在我有了一个想法之后,我将专注于子图、集团、社区...... 【参考方案1】:
 from matplotlib import pylab
 import networkx as nx

 def save_graph(graph,file_name):
    #initialze Figure
    plt.figure(num=None, figsize=(20, 20), dpi=80)
    plt.axis('off')
    fig = plt.figure(1)
    pos = nx.spring_layout(graph)
    nx.draw_networkx_nodes(graph,pos)
    nx.draw_networkx_edges(graph,pos)
    nx.draw_networkx_labels(graph,pos)

    cut = 1.00
    xmax = cut * max(xx for xx, yy in pos.values())
    ymax = cut * max(yy for xx, yy in pos.values())
    plt.xlim(0, xmax)
    plt.ylim(0, ymax)

    plt.savefig(file_name,bbox_inches="tight")
    pylab.close()
    del fig

#Assuming that the graph g has nodes and edges entered
save_graph(g,"my_graph.pdf")

#it can also be saved in .svg, .png. or .ps formats

这回答了您的第一个问题。 Networkx 没有放大节点的功能。使用 Gephi 来实现这个功能。 Gephi 接受 CSV 格式的边缘列表并生成可视化,其中可以交互地进行缩放。

【讨论】:

我刚刚使用 networkx 函数将图形保存为边缘列表格式,并且能够将其读入 Gephi!

以上是关于使用 python 和 networkx 进行大图可视化的主要内容,如果未能解决你的问题,请参考以下文章

Hadoop 上的大图处理

python-networkx学习

networkx/igraph (Python) 上的指定边长

利用python的networkx3.0 进行GIS的网络分析

可以使用 python 3 从 networkx 获取分层图吗?

如何在 Python 中生成不同类型的图形?