我需要建议来渲染具有178,000个节点和500,000个边缘的无向图。我尝试过Neato,Tulip和Cytoscape。 Neato甚至没有近距离接触,Tulip和Cytoscape声称他们可以处理它,但似乎无法做到。 (郁金香什么都不做,Cytoscape声称工作,然后停止。)
我只是喜欢一个矢量格式文件(ps或pdf),它具有远程合理的节点布局。
答案 0 :(得分:26)
Graphviz本身提供了渲染大型图形的解决方案。
即,Graphviz包含sfdp
,fdp的多尺度版本(也在graphviz中,类似于neato),用于大型无向图的布局,这对于绘制大图(70k节点,500k边)非常有用。我的项目。
您可以在graphviz网站上找到此软件的文档http://www.graphviz.org/
更多信息,可在此处找到描述基础技术和示例的论文: http://yifanhu.net/PUB/graph_draw_small.pdf
答案 1 :(得分:20)
我建议您首先对数据进行一些预处理,例如将节点折叠到群集,然后可视化群集。折叠将减少节点数量,并使诸如Kamada-Kawai或Fruchterman-Reingold等算法更容易渲染结果图。
如果您确实需要可视化500.000个节点,那么您可以考虑使用简单的圆形布局。这将很容易渲染,而不会出现基于强制算法的问题。看看Circos:http://mkweb.bcgsc.ca/circos/
Circos是由生物信息学人员开发的图形可视化,专门用于可视化基因组和其他极大且复杂的数据集。
这是一个基于PERL的软件包,我希望这不会有问题。
答案 2 :(得分:17)
我在python中使用graph-tool库得到了很好的结果。下图有1,490个节点和19,090个边缘 - 在我的笔记本电脑上渲染大约需要5分钟。
图表数据来自Adamic和Glance在“The political blogosphere and the 2004 US Election” pdf link here中描述的政治博客网络。如果放大,您可以看到每个节点的博客网址。
以下是我用来绘制它的代码(博客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')
答案 3 :(得分:12)
答案 4 :(得分:4)
Mathematica很可能会处理它,但我不得不承认我的第一反应是评论说“拿一张纸,把它染成黑色”。有没有办法降低图的密度?
可能的问题是您似乎在寻找布局,而不仅仅是渲染。我不了解各种工具实现的布局的Big O特性,但直觉上我猜想可能需要长时间来布置那么多数据。
答案 5 :(得分:3)
它需要真正准确吗?
根据您要完成的工作,仅绘制10%或1%的数据量可能就足够了。 (当然,它也可能完全没用,但这一切都取决于可视化的用途)
答案 6 :(得分:2)
BioFabric(www.BioFabric.org)是另一种可视化大图的工具。它应该能够处理所描述的网络(178,000个节点和500,000个边缘),但初始布局可能需要一段时间。此处显示的网络(来自斯坦福大型网络数据集集合)是斯坦福网络网络,其拥有281,903个节点和2,312,497个边缘:
BioFabric的可扩展性是由于它将节点表示为点而不是水平线。然后将边缘显示为垂直线。对于如何工作的一些直觉,有Super-Quick BioFabric Demo,这是一个使用D3动画的小网络。
主要应用程序是用Java编写的。目前,它只能导出PNG图像,而不能导出PDF。 RBioFabric有一个PDF导出选项,虽然这是一个非常简单的实现,但它还无法处理真正的大型网络。
完全披露:BioFabric是我写的工具。
答案 7 :(得分:2)
我希望边缘聚类(http://www.visualcomplexity.com/vc/project_details.cfm?id=679&index=679&domain=)会有所帮助。该技术将相关边缘捆绑在一起,降低了图形的视觉复杂性。您可能必须亲自实现该算法。
答案 8 :(得分:1)
查看基于Java / Jython的GUESS:http://graphexploration.cond.org/
答案 9 :(得分:1)
Large Graph Layout (LGL)项目在类似的问题上给了我很多帮助。它处理布局并有一个小的Java应用程序来绘制2D中生成的布局。 没有开箱即用的矢量输出所以你必须自己绘制图形(给定LGL产生的节点坐标)
答案 10 :(得分:1)
您可以尝试aiSee: http://www.aisee.com/manual/unix/56.htm
答案 11 :(得分:1)
如果所有其他方法都失败,您可以将这些文件的清理版本作为调试方案提供给这些工具的开发人员。
答案 12 :(得分:0)
我认为你不能在平面布局中直观地看到它。
我被Hyperbolic Graphs, described in this research paper吸引了一段时间。试试SourceForge中的软件。
另一个想法是使用TreeMap上的Panopticode绘制节点图表。
答案 13 :(得分:0)
您也可以尝试NAViGaTOR(披露:我是该软件的开发人员之一)。我们已经成功地用多达170万个边缘可视化图形。虽然这种大型网络很难操作(用户界面会变得迟钝)。但是,它确实使用OpenGL进行可视化,因此一些开销会转移到图形卡上。
另请注意,在成功打开大型网络之前,您必须在File-&gt; Preferences对话框中调高内存设置。
最后,正如大多数其他回复所指出的那样,您最好将数据重新组织成更小,更有意义的内容。
答案 14 :(得分:0)
这里有一个应用列表: http://www.mkbergman.com/?p=414
Walrus和LGL是两种适合大型图形的工具。但是,两者似乎都要求图形以他们自己的特殊格式作为文本文件输入,这可能很痛苦。
答案 15 :(得分:0)
首先,我想提出第二个外星人的建议来尝试sfdp。这是Neato的大规模版本。
正如OJW建议你也可以在R2中绘制节点。你的边缘实际上提供了他所谓的“自然排序”。特别是,您可以绘制归一化图拉普拉斯算子的第二和第三特征向量的分量。这是this wikipedia page about spectral clustering中的矩阵L
。你应该能够写下这个矩阵而不理解它背后的线性代数。然后,您已将问题简化为近似计算大型稀疏矩阵的前几个特征向量。这通常通过迭代方法完成,并在标准线性代数包中实现。此方法应扩展到非常大的图形。
答案 16 :(得分:0)
可以显示图形的Windows工具是pajek,它会生成eps输出,但我不知道它是否可以读取您的数据。