Python和NetworkX实现的大型图形可视化

45

我在使用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。从维基百科页面可以得知,dot格式用于有向图,于是我创建了一个dot文件:

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

这个方法很有效,我在当前目录下生成了一个12兆字节的dot文件。接下来,我运行了dot程序(graphviz的一部分),用来创建一个postscript文件:

dot -Tps g.dot -o g.ps

这减慢了我的电脑速度,需要运行几分钟,然后在终端中显示Killed。因此它永远无法执行... 在阅读 graphviz 的文档时,似乎只支持大型图形可视化的不定向图。

问题: 通过这两次不成功的尝试,有没有人能向我展示如何使用 Python 和 Networkx 可视化具有约 215,000 个顶点和 215,000 条边的大型图形?我怀疑,与 Graphviz 一样,我必须将其输出到一个中间格式(虽然这不会太难,但它不会像内置函数那样容易),然后使用另一个工具读取中间格式,再输出可视化结果。

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

  1. 将网络x图形输出为中间格式
  2. 使用新的包/软件/工具(理想情况下是 Python-interactive)读取中间格式并可视化大型图形

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


1
想象一下,您成功地创建了这个大图的PostScript图像。您会怎么处理它呢?假设您花费10秒钟查看每个节点,那么检查整个图形将需要近25天的时间。我认为,与其显示整个图形(作为一个PostScript图像),您需要一些方法来“放大”感兴趣的子图。 - unutbu
2
我想了解一下我的图形是什么样子的。在我有了一个大致的概念之后,我将专注于子图、团、社区等方面... - CodeKingPlusPlus
1个回答

29
 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来实现这个功能。Gephi可以接受CSV格式的边列表并生成可交互式的可视化效果,在此过程中可以进行缩放操作。


1
我刚刚使用了networkx函数将图形保存为edgelist格式,并成功地将其读入Gephi! - CodeKingPlusPlus

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接