graph-theory - nodesep - graphviz>& lt
¿Visualizando un gráfico no dirigido que es demasiado grande para GraphViz? (17)
¿Necesita ser realmente preciso?
Dependiendo de lo que intente lograr, podría ser suficiente graficar el 10% o el 1% del volumen de datos. (por supuesto, también podría ser completamente inútil, pero todo depende de para qué sirve la visualización)
Necesito consejos para representar un gráfico no dirigido con 178,000 nodos y 500,000 bordes. He probado Neato, Tulip y Cytoscape. Neato ni siquiera se acerca remotamente, y Tulip y Cytoscape afirman que pueden manejarlo pero no parecen poder hacerlo. (Tulip no hace nada y Cytoscape dice que está trabajando, y luego simplemente se detiene).
Me gustaría simplemente un archivo de formato vectorial (ps o pdf) con un diseño remotamente razonable de los nodos.
BioFabric ( www.BioFabric.org ) es otra herramienta para visualizar gráficos grandes. Debería poder manejar la red descrita (178,000 nodos y 500,000 bordes) OK, aunque el diseño inicial puede tomar un tiempo. El programa de la red aquí (de Stanford Large Network Dataset Collection) es Stanford Web Network, que tiene 281,903 nodos y 2,312,497 bordes:
La escalabilidad de BioFabric se debe al hecho de que representa los nodos no como puntos, sino como líneas horizontales. Los bordes se muestran como líneas verticales. Para tener un poco de intuición sobre cómo funciona esto, está la demostración Super-Quick BioFabric , que es una pequeña red que se anima con D3.
La aplicación principal está escrita en Java. Por el momento, solo puede exportar imágenes PNG, no archivos PDF. Existe una opción de exportación de PDF desde RBioFabric , aunque es una implementación muy simple que aún no puede manejar redes realmente grandes.
Divulgación completa: BioFabric es una herramienta que escribí.
Consulte el GUESS basado en Java / Jython: http://graphexploration.cond.org/
Es muy probable que Mathematica lo maneje, pero debo admitir que mi primera reacción fue similar a la del comentario que decía "toma una hoja de papel y colorea el papel en negro". ¿No hay forma de reducir la densidad del gráfico?
Un posible problema es que parece estar buscando el diseño, no solo el renderizado. No tengo conocimiento acerca de las características de Big O de los diseños implementados por varias herramientas, pero intuitivamente supongo que podría tomar mucho tiempo diseñar esa cantidad de datos.
Espero que la agrupación de bordes ( http://www.visualcomplexity.com/vc/project_details.cfm?id=679&index=679&domain= ) ayude. Esta técnica agrupa bordes relacionados entre sí, reduciendo la complejidad visual del gráfico. Sin embargo, puede que tenga que implementar el algoritmo usted mismo.
Graphviz en sí proporciona una solución para representar gráficos grandes.
A saber, Graphviz incluye sfdp
, una versión multiescala de fdp (también en graphviz, similar a neato) para el diseño de grandes gráficos no dirigidos que ha sido útil para dibujar grandes gráficos (70k nodos, 500k bordes) en mi proyecto.
Puede encontrar documentación para este software en el sitio web graphviz en http://www.graphviz.org/
Puede encontrar más información, un documento que describe las técnicas y ejemplos subyacentes aquí: http://yifanhu.net/PUB/graph_draw_small.pdf
Hay una lista de aplicaciones aquí: http://www.mkbergman.com/?p=414
Walrus y LGL son dos herramientas supuestamente adecuadas para gráficos grandes. Sin embargo, parece que ambos requieren que los gráficos se ingresen como archivos de texto en su propio formato especial, lo que podría ser un problema.
He obtenido buenos resultados al utilizar la biblioteca de graph-tool en Python. El siguiente gráfico tiene 1.490 nodos y 19.090 bordes: tardó alrededor de 5 minutos en renderizar en mi computadora portátil.
Los datos del gráfico provienen de la red de blogs políticos descrita por Adamic y Glance en el enlace pdf "The political blogosphere and the 2004 US Election" here . Si amplía, puede ver las URL del blog para cada nodo.
Aquí está el código que solía dibujar (blog 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'')
Le sugiero que primero haga un preprocesamiento de los datos, por ejemplo, colapsando nodos en clústeres y luego visualizando los clústeres. El colapso reducirá la cantidad de nodos y facilitará que algoritmos como Kamada-Kawai o Fruchterman-Reingold representen el gráfico resultante.
Si realmente necesita visualizar 500,000 nodos, entonces puede considerar usar un diseño circular simple. Esto será fácil de renderizar sin los problemas que tienen los algoritmos basados en la fuerza. Eche un vistazo a Circos: http://mkweb.bcgsc.ca/circos/
Circos es una visualización gráfica desarrollada por personas de bioinformática que está diseñada para visualizar genomas y otros conjuntos de datos extremadamente grandes y complejos.
Es un paquete basado en PERL, espero que no sea problemático.
No creo que puedas acercarte remotamente a visualizar eso en un diseño plano.
Me han intrigado los Gráficos hiperbólicos, descritos en este documento de investigación durante algún tiempo. Pruebe el software de SourceForge .
Otra idea es simplemente graficar los nodos usando un TreeMap como se ve en Panopticode .
Primero, quisiera hacer una segunda sugerencia de aliekens para probar sfdp. Es la versión a gran escala de Neato.
Como OJW sugiere, también podrías trazar los nodos en R2. Tus bordes realmente proveen lo que él llama un "orden natural". En particular, puede trazar los componentes del segundo y tercer vectores propios del gráfico normalizado Laplaciano. Esta es la matriz L
en esta página wikipedia sobre la agrupación espectral . Debería poder escribir esta matriz sin entender el álgebra lineal detrás de ella. Luego, ha reducido su problema para calcular aproximadamente los primeros vectores propios de una gran matriz dispersa. Esto se realiza tradicionalmente mediante métodos iterativos y se implementa en paquetes de álgebra lineal estándar. Este método debería escalar hasta gráficos muy grandes.
Puede intentar aiSee: http://www.aisee.com/manual/unix/56.htm
Puede ofrecer una versión desinfectada del archivo a los desarrolladores de esas herramientas como un escenario de depuración, si todo lo demás falla.
También puedes probar NAViGaTOR (revelación: soy uno de los desarrolladores de ese software). Hemos visualizado gráficos con hasta 1,7 millones de bordes con éxito. Aunque estas redes tan grandes son difíciles de manipular (la interfaz de usuario se ralentizará). Sin embargo, utiliza OpenGL para la visualización, por lo que parte de la carga se transfiere a la tarjeta gráfica.
También tenga en cuenta que deberá subir la configuración de la memoria en el cuadro de diálogo Archivo-> Preferencias antes de poder abrir con éxito una red tan grande.
Finalmente, como señala la mayoría de las otras respuestas, es mejor que reorganices tus datos en algo más pequeño y más significativo.
Una herramienta de Windows que puede visualizar gráficos es pajek , genera una salida de eps, sin embargo, no sé si puede leer tus datos.
El proyecto Large Graph Layout (LGL) me ayudó mucho con un ptoblema similar. Maneja el diseño y tiene una pequeña aplicación java para dibujar diseños producidos en 2D. No hay salida de vector fuera de la caja por lo que tendrá que dibujar el gráfico usted mismo (dadas las coordenadas del nodo producidas por LGL)