Визуализация неориентированного графа слишком велика для GraphViz? - PullRequest
70 голосов
/ 27 октября 2008

Мне нужен совет для рендеринга ненаправленного графа с 178 000 узлов и 500 000 ребер. Я пробовал Neato, Tulip и Cytoscape. Neato даже близко не подходит, и Tulip и Cytoscape утверждают, что могут справиться с этим, но, похоже, не могут. (Тюльпан ничего не делает, и Cytoscape утверждает, что работает, а затем просто останавливается.)

Я бы просто хотел файл векторного формата (ps или pdf) с удаленно разумным расположением узлов.

Ответы [ 17 ]

26 голосов
/ 23 февраля 2011

Graphviz сам предоставляет решение для рендеринга больших графиков.

А именно, Graphviz включает sfdp, многомасштабную версию fdp (также в graphviz, похожую на neato) для макета больших неориентированных графов, которая была полезна для рисования больших графов (70k узлов, 500k ребер) в моем проекте ,

Документацию по этому программному обеспечению можно найти на самом веб-сайте graphviz по адресу http://www.graphviz.org/

Больше информации, документ, описывающий основные методы и примеры, можно найти здесь: http://yifanhu.net/PUB/graph_draw_small.pdf

20 голосов
/ 02 июня 2009

Я предлагаю вам сначала выполнить некоторую предварительную обработку данных, например свертывание узлов в кластеры, а затем визуализация кластеров. Свертывание уменьшит количество узлов и упростит алгоритмы, такие как Kamada-Kawai или Fruchterman-Reingold, для визуализации полученного графа.

Если вам действительно нужно визуализировать 500 000 узлов, можете ли вы использовать простую круговую схему. Это будет легко сделать без проблем, связанных с алгоритмами, основанными на форсировании. Посмотрите на Circos: http://mkweb.bcgsc.ca/circos/

Circos - это графическая визуализация, разработанная людьми, работающими в области биоинформатики, которая предназначена для визуализации геномов и других чрезвычайно больших и сложных наборов данных.

Это пакет на основе PERL, надеюсь, это не проблема.

17 голосов
/ 08 октября 2014

Я получил хорошие результаты, используя библиотеку graph-tool в python. На приведенном ниже графике 1490 узлов и 19 090 ребер - рендеринг на моем ноутбуке занял около 5 минут.

political blogging network

Данные графика получены из политической сети блогов, описанной Adamic and Glance в «Политическая блогосфера и выборы в США 2004 года» pdf link здесь . При увеличении можно увидеть URL-адреса блогов для каждого узла.

zoomed

Вот код, который я использовал для рисования (блог 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')
12 голосов
/ 21 февраля 2011

Попробуйте Gephi , у него есть новый плагин макета под названием OpenOrd , который масштабируется до миллионов узлов.

4 голосов
/ 27 октября 2008

Mathematica вполне может с этим справиться, но я должен признать, что моя первая реакция была в соответствии с комментарием, который гласил: «Возьми лист бумаги и раскрась его в черный цвет». Нет ли способа уменьшить плотность графика?

Возможная проблема в том, что вы, похоже, ищете макет, а не просто рендеринг. Я не знаю о характеристиках Big O макетов, реализованных различными инструментами, но я интуитивно догадываюсь, что может потребоваться long время, чтобы выложить столько данных.

3 голосов
/ 27 мая 2009

Должно ли оно быть действительно точным?

В зависимости от того, что вы пытаетесь выполнить, может быть достаточно просто составить график 10% или 1% объема данных. (конечно, это также может быть совершенно бесполезно, но все зависит от того, для чего нужна визуализация)

2 голосов
/ 30 января 2015

BioFabric ( www.BioFabric.org ) - еще один инструмент для визуализации больших графиков. Он должен быть в состоянии обрабатывать описанную сеть (178 000 узлов и 500 000 ребер) ОК, хотя первоначальная схема может занять некоторое время. Здесь показано сетевое шоу (из коллекции наборов данных большой сети Стэнфорда) - Stanford Web Network, имеющая 281 903 узла и 2 312 497 ребер:

Stanford Web Network Масштабируемость BioFabric обусловлена ​​тем, что она представляет узлы не в виде точек, а в виде горизонтальных линий. Затем края отображаются в виде вертикальных линий. Для некоторой интуиции о том, как это работает, есть Super-Quick BioFabric Demo , представляющий собой небольшую сеть, анимированную с использованием D3.

Основное приложение написано на Java. На данный момент он может экспортировать только PNG-изображения, а не PDF-файлы. Существует опция экспорта PDF из RBioFabric , хотя это очень простая реализация, которая пока не может работать с действительно большими сетями.

Полное раскрытие: BioFabric - это инструмент, который я написал.

2 голосов
/ 27 августа 2009

Я ожидаю, что кластеризация ребер (http://www.visualcomplexity.com/vc/project_details.cfm?id=679&index=679&domain=) поможет. Этот метод объединяет связанные ребра вместе, уменьшая визуальную сложность графика. Возможно, вам придется реализовать алгоритм самостоятельно.

1 голос
/ 06 января 2009

Вы можете попробовать aiSee: http://www.aisee.com/manual/unix/56.htm

1 голос
/ 04 ноября 2009
Проект

Large Graph Layout (LGL) мне очень помог с подобной проблемой. Он обрабатывает макет и имеет небольшое Java-приложение для рисования созданных макетов в 2D. Из коробки не выводится вектор, поэтому вам придется рисовать график самостоятельно (с учетом координат узла, созданных LGL)

...