可视化对GraphViz太大的无向图?


72

我需要有关渲染具有178,000个节点和500,000条边的无向图的建议。我已经尝试过Neato,Tulip和Cytoscape。Neato甚至都不遥不可及,Tulip和Cytoscape声称他们可以应付,但似乎不行。(郁金香什么也不做,Cytoscape声称正在工作,然后停下来。)

我只是想要一个节点格式合理的矢量格式文件(ps或pdf)。


55
画一个小方块,然后全黑。:-)对不起,我无法抗拒。
tvanfosson

该图代表什么样的数据?也许您可以自动简化它?这只是我的猜测:我没有所代表数据的信息,因此很难猜测。无论如何,这么多的节点和边缘在一张纸上都不会表现得很好...
2012年

1
您期望PDF的大小是多少-铺在几张A3纸上的东西?
安迪·登特

1
@安迪·登特(Andy Dent)或几百...
汤姆·尼兰

您可能需要增加cytoscape的堆: cytoscape.wodaklab.org/wiki/…–
Ron

Answers:


26

Graphviz本身提供了用于呈现大型图形的解决方案。

也就是说,Graphviz包括sfdpfdp的多尺度版本(在graphviz中也类似于neato),用于布局大型无向图,这对于在我的项目中绘制大型图(70k节点,500k边)非常有用。

您可以在graphviz网站本身上找到此软件的文档,网址为http://www.graphviz.org/。

更多信息,可在下面找到描述基本技术和示例的论文:http: //yifanhu.net/PUB/graph_draw_small.pdf


1
这是解决networkx / graphviz崩溃的最简单解决方案,谢谢!
2012年

1
该论文的链接现在已断开-您能否包括论文的标题,以便将来其他人可以找到它?
JustinJDavies

我相信这是该论文的新位置:www.research.att.com/~yifanhu/PUB/graph_draw_small.pdf胡以凡撰写的“高效,高质量的力导向图”。可以在这里找到更多信息:www2.research.att.com/~yifanhu/SOFTWARE/SFDP/index.html
Anthony Liekens 2013年

20

我建议您首先对数据进行一些预处理,例如将节点折叠为群集,然后可视化群集。折叠将减少节点的数量,并使Kamada-Kawai或Fruchterman-Reingold等算法更容易呈现结果图。

如果您确实需要可视化500.000个节点,则可以考虑使用简单的圆形布局。如果没有基于力的算法所存在的问题,这将很容易呈现。看看Circos:http://mkweb.bcgsc.ca/circos/

Circos是由生物信息学人员开发的图形可视化工具,专门用于可视化基因组和其他超大型和复杂的数据集。

这是一个基于PERL的程序包,我希望这不会有问题。


19

使用python中的graph-tool库取得了很好的效果。下图有1,490个节点和19,090个边-在笔记本电脑上渲染大约需要5分钟。

政治博客网络

图表数据来自亚当和概览中描述的政治博客网“的政治博客和2004年的美国大选” PDF链接在这里。如果放大,则可以看到每个节点的博客URL。

放大

这是我用来绘制的代码(博客http://ryancompton.net/2014/10/22/stochastic-block-model-based-edge-bundles-in-graph-tool/):

import graph_tool.all as gt
import math

g = gt.collection.data["polblogs"] #  http://www2.scedu.unibo.it/roversi/SocioNet/AdamicGlanceBlogWWW.pdf
print(g.num_vertices(), g.num_edges())

#reduce to only connected nodes
g = gt.GraphView(g,vfilt=lambda v: (v.out_degree() > 0) and (v.in_degree() > 0) )
g.purge_vertices()

print(g.num_vertices(), g.num_edges())

#use 1->Republican, 2->Democrat
red_blue_map = {1:(1,0,0,1),0:(0,0,1,1)}
plot_color = g.new_vertex_property('vector<double>')
g.vertex_properties['plot_color'] = plot_color
for v in g.vertices():
    plot_color[v] = red_blue_map[g.vertex_properties['value'][v]]

#edge colors
alpha=0.15
edge_color = g.new_edge_property('vector<double>')
g.edge_properties['edge_color']=edge_color
for e in g.edges():
    if plot_color[e.source()] != plot_color[e.target()]:
        if plot_color[e.source()] == (0,0,1,1):
            #orange on dem -> rep
            edge_color[e] = (255.0/255.0, 102/255.0, 0/255.0, alpha)
        else:
            edge_color[e] = (102.0/255.0, 51/255.0, 153/255.0, alpha)            
    #red on rep-rep edges
    elif plot_color[e.source()] == (1,0,0,1):
        edge_color[e] = (1,0,0, alpha)
    #blue on dem-dem edges
    else:
        edge_color[e] = (0,0,1, alpha)

state = gt.minimize_nested_blockmodel_dl(g, deg_corr=True)
bstack = state.get_bstack()
t = gt.get_hierarchy_tree(bstack)[0]
tpos = pos = gt.radial_tree_layout(t, t.vertex(t.num_vertices() - 1), weighted=True)
cts = gt.get_hierarchy_control_points(g, t, tpos)
pos = g.own_property(tpos)
b = bstack[0].vp["b"]

#labels
text_rot = g.new_vertex_property('double')
g.vertex_properties['text_rot'] = text_rot
for v in g.vertices():
    if pos[v][0] >0:
        text_rot[v] = math.atan(pos[v][1]/pos[v][0])
    else:
        text_rot[v] = math.pi + math.atan(pos[v][1]/pos[v][0])

gt.graph_draw(g, pos=pos, vertex_fill_color=g.vertex_properties['plot_color'], 
            vertex_color=g.vertex_properties['plot_color'],
            edge_control_points=cts,
            vertex_size=10,
            vertex_text=g.vertex_properties['label'],
            vertex_text_rotation=g.vertex_properties['text_rot'],
            vertex_text_position=1,
            vertex_font_size=9,
            edge_color=g.edge_properties['edge_color'],
            vertex_anchor=0,
            bg_color=[0,0,0,1],
            output_size=[4024,4024],
            output='polblogs_blockmodel.png')

1
图形渲染确实是一件美事。
Lou


4

Mathematica很有可能会处理它,但我必须承认我的第一个反应是遵循这样的评论,即“拿一张纸并将其涂成黑色”。有没有办法降低图表的密度?

一个可能的问题是您似乎在寻找布局,而不仅仅是渲染。我对各种工具所实现的布局的Big O特性一无所知,但凭直觉我会猜测,布置这么多数据可能需要很长时间


4
Mathematica不能很好地处理非常大的图形,甚至没有带有许多内置图形处理功能的版本8也是如此。最大的困难是它不能独立于绘图而公开布局算法,并且其图形渲染太慢而无法方便地处理这么多边缘。
Szabolcs

3

是否需要真正准确?

根据您要完成的任务,仅绘制10%或1%的数据量可能就足够了。(当然,它也可能完全没有用,但是这完全取决于可视化的目的)


3

BioFabric(www.BioFabric.org)是另一种可视化大图的工具。尽管初始布局可能需要一些时间,但它应该能够处理所描述的网络(178,000个节点和500,000个边缘)。此处显示的网络(来自Stanford大型网络数据集)是Stanford Web网络,该网络具有281,903个节点和2,312,497个边缘:

斯坦福网络 BioFabric的可伸缩性是因为它不是将节点表示为点而是表示为水平线。然后将边缘显示为垂直线。有关其工作原理的一些直观信息,请参见超快速生物织物演示,它是一个使用D3进行动画处理的小型网络。

主要应用程序是用Java编写的。目前,它只能导出PNG图片,而不能导出PDF。RBioFabric有一个PDF导出选项,尽管这是一个非常简单的实现,尚不能处理真正的大型网络。

全面披露:BioFabric是我编写的工具。



1

如果其他所有方法均失败,则可以将这些文件的清理版本作为调试方案提供给这些工具的开发人员。





0

一个可以可视化图形的Windows工具是pajek,它会生成eps输出,但是我不知道它是否可以读取您的数据。


0

这里有应用程序列表:http ://www.mkbergman.com/?p= 414

Walrus和LGL是两个适用于大型图形的工具。但是,两者似乎都要求图形以其自己的特殊格式作为文本文件输入,这可能会很麻烦。



0

您也可以尝试NAViGaTOR(公开:我是该软件的开发人员之一)。我们已经成功地可视化了多达170万条边的图形。尽管这样的大型网络很难操作(用户界面会变得迟钝)。但是,它的确使用了OpenGL进行可视化,因此一些开销转移到了图形卡上。

还要注意,在成功打开这么大的网络之前,必须先在“文件”->“首选项”对话框中增加内存设置。

最后,正如大多数其他答复所指出的那样,最好将数据重新组织为更小更有意义的内容。


0

首先,我想第二次提出阿里肯斯的建议,尝试sfdp。它是Neato的大型版本。

正如OJW建议的那样,您也可以在R2中绘制节点。您的边缘实际上提供了他所谓的“自然排序”。特别是,您可以绘制归一化图拉普拉斯算子的第二和第三特征向量的分量。这是矩阵L大约谱聚类这个维基百科页面。您应该能够在不了解其背后的线性代数的情况下写下该矩阵。然后,将问题简化为近似计算大型稀疏矩阵的前几个特征向量。传统上,这是通过迭代方法完成的,并在标准线性代数包中实现。此方法应按比例放大到非常大的图形。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.