¿Alternativa para Graphviz con una mejor ubicación automática de nodos para gráficos grandes?

En el pasado, usé Graphviz para crear dibujos de gráficos. Es una buena herramienta para gráficos pequeños.

Pero desafortunadamente, para gráficos grandes, Graphviz realmente apesta:

  • Siempre cruzaba aristas que obviamente se podían dibujar sin cruz.
  • Superpone diferentes textos, haciéndolos ilegibles.
  • No tiene un estilo reutilizable (como CSS) y debe repetir las mismas personalizaciones en nodos y bordes una y otra vez.
  • Si el usuario quiere, simplemente diga, intercambiar las posiciones de dos nodos. Para hacerlo, con frecuencia es necesario piratear fuertemente el archivo fuente, probablemente arruinando partes no relacionadas del gráfico en el proceso.
  • Es muy fácil que para hacer pequeños cambios en un lugar aislado del gráfico, Graphviz fuerce cambios importantes en otro lugar, invalidando con frecuencia horas de trabajo tratando de convencerlo de que lo dibuje bien.
  • Desperdicia mucho espacio en el gráfico y, al mismo tiempo, sobrecarga algunos lugares de manera muy apretada.
  • A veces, algunos bordes hacen caminos muy tortuosos para conectar el nodo de origen con el nodo de destino, presentando extrañas curvas inútiles y muchos bordes superpuestos que corren lateralmente.
  • Cuenta con efectos de avalancha. Las modificaciones triviales en algún lugar del gráfico podrían perturbar la heurística de Graphviz, lo que daría como resultado un gráfico completamente diferente.
  • Un montón de bichos...

Quiero algo que, como usuario, pueda simplemente:

  • Defina qué son los nodos, posiblemente con el estilo que se aplicará.
  • Di cuáles son los bordes, posiblemente con el estilo que se aplicará.

Y luego el programa da:

  • Un gráfico con el mínimo número posible de cruces.
  • Los nodos bastante alineados son buenos.

No quiero:

  • Agregue muchos trucos en la entrada solo porque la herramienta es demasiado estúpida para ver que podría intercambiar dos nodos específicos para eliminar un cruce.
  • Necesita colocar bordes y nodos manualmente.
  • Consigue efectos de avalancha.

Entonces, ¿cuál podría ser un buen reemplazo de Graphviz? Realmente quiero que sea gratis.

Nota: No me importa mucho el formato en el que se debe ingresar el gráfico, siempre que pueda guardar y editar un archivo con la descripción del gráfico (cualquiera que sea el idioma de dicha descripción). Por lo tanto, no hay absolutamente ninguna necesidad de seguir en el lenguaje de puntos o algo similar (de hecho, estaría más que feliz de deshacerme de mis archivos de puntos por completo, ya que hay muchos más trucos que la descripción gráfica real allí).

Miren amigos, así es como hacen una pregunta aquí (y voy a pasar por alto la graphviz really suckspropaganda porque hacen un buen trabajo explicando por qué "apesta").
Un compañero de trabajo dice que d3.js obtiene (la mayor parte) el posicionamiento bien hecho. Obviamente, tiene otros efectos secundarios no tan agradables, como estar basado en un navegador y ser dinámico (es decir, no todos obtienen el mismo resultado), por lo que puede que no sea lo que desea.
Antes de usar Graphvis, generaba gráficos en Perl con Graph::Easy (y con Graph) . search.cpan.org/~tels/Graph-Easy/lib/Graph/Easy.pm No recomendaría Graph o Graph::Easy. Migré lejos de ellos para que mi programa perl escupiera un archivo de puntos como una cadena y ejecutara graphvis en él.
Según más información de un compañero de trabajo, graphviz es bastante bueno (sí, sabemos lo malo que puede ser el resultado, pero el problema no es trivial en absoluto) para el caso genérico. Si puede hacer ciertas suposiciones (como, sin ciclos), hay mejores algoritmos, pero graphviz parece incluirlos también (juegue un poco con sus opciones). Necesita la agrupación en clústeres, y esto solo se vuelve más accesible cuando puede usar suposiciones sobre los datos de entrada.
@mirabilos Créeme, ya probé muchas opciones (desde 2011). Si el gráfico no tuviera ciclo, degeneraría en una especie de árbol y sería fácil de dibujar. Sin embargo, mi gráfico en realidad tiene muchos ciclos y tiene alrededor de 200 nodos. Para manejar eso con graphviz, tuve que dividir el gráfico en 12 subgráficos independientes, repitiendo los nodos que aparecen en más de un gráfico. Además, necesitaba agregar muchos nodos, bordes y grupos invisibles. En mis gráficos, los grupos tienen poco o ningún significado semántico, son solo trucos para tratar de forzar a graphviz a hacer su trabajo correctamente.
@Oxinabox, sí, eso es triste. Pero dada la gran cantidad de hacks en la heurística, las etiquetas y la estructura de graphviz, creo que un reinicio desde cero sería mucho mejor que una bifurcación.
Computational Science SE tiene la misma pregunta aquí: scicomp.stackexchange.com/questions/3315/… . Además de GraphViz, hay varias opciones disponibles: Gratis * JavaScript InfoVis Toolkit * Paquete igraph para el sistema estadístico R * zGrViewer * Biblioteca de gráficos grande No libre * GraphInsight
Estos no satisfacen las necesidades del OP porque es demasiado manual, pero para algunos usuarios, Cupid es una forma válida de proceder.
¿Puede publicar (o proporcionar un enlace) de un gráfico de muestra que le gustaría diseñar?
@Sebastian Bueno, ya dejé la empresa donde tuvimos este problema. Pero puedo tener los datos en algún archivo de copia de seguridad en alguna parte.
Si lo hace, no lo publique aquí para evitar meterse en problemas legales. No debe tener ningún dato que pertenezca a una empresa que haya dejado.

Respuestas (5)

Lo siento por la decepción. Graphviz podría ser mejor en muchos sentidos, pero en este punto las perspectivas no son muy buenas porque AT&T no está apoyando el trabajo tanto como lo hizo en el pasado y algunos de los autores (como yo) se han ido para buscar otros trabajar. Estamos buscando personas que quieran hacerse cargo, así que háganoslo saber.

También estamos impresionados con yFiles .

Pruebe también el software Tom Sawyer ; tienen mucho talento en ingeniería y trabajaron mucho en métodos de diseño avanzados y herramientas interactivas. (Es posible que deba gastar $$$ ya que la prueba gratuita parece estar descontinuada).

La pregunta no decía qué herramienta u opciones de diseño específicas se probaron o qué tan grande es una red "grande", por lo que no está claro qué sugerir.

Si "grande" significa quizás cientos de nodos, intente neato -Goverlap=false(para evitar la superposición de etiquetas de texto de nodos) y posiblemente -Gmodel=subsetintente una mejor agrupación. (Estas opciones no son las predeterminadas, porque en el análisis de datos, por ejemplo, en bioinformática, una incrustación directa de MDS brinda una representación más precisa de las distancias en la red subyacente).

Si "grande" significa miles de nodos, quizás muchos miles, use sfdpen lugar de neatonuevamente con -Goverlap=false. (El modelo de distancia de subconjunto no está disponible en sfdp, porque no está claro cómo manejar longitudes de borde variables al fusionar bordes en un solucionador jerárquico). Puede ver un buen ejemplo de un gráfico de 1054 nodos aquí

Para "problemas de espacio desperdiciado" en el caso de componentes desconectados, vea también los atributos pack y packmode. Las soluciones a tales problemas no son obvias (básicamente, está tratando de empaquetar formas irregulares de manera óptima, con restricciones adicionales y, a veces, a la escala de lo que la gente considere "grande", por lo que se necesitan algoritmos subcuadráticos). Para gráficos conectados, experimente con -Opciones de superposición.

Esas son las sugerencias. En cuanto a excusas y explicaciones...

Lo que alguien llama el "efecto de avalancha" también se llama inestabilidad de diseño con respecto a cambios (menores) en el gráfico de entrada. Esta es una propiedad de casi todos los programas de diseño de gráficos por lotes y solucionadores de restricciones. Por lo tanto, debe buscar herramientas interactivas como el diseño de incrustación de resorte D3, y Tim Dwyer hizo un gran trabajo en esto cuando estaba en Microsoft, por lo que quizás algún día su kit de herramientas de diseño gráfico (AGL) adopte sus métodos de restricción interactivos. Solo una observación, la mayoría de los investigadores y programadores no han intentado atacar la escala, la interactividad y la estética al mismo tiempo (elija 2 de las anteriores...)

El tema del estilo también es bueno, simplemente no teníamos tiempo/energía para abordarlo, ya que la mayoría de los gráficos se generan automáticamente, por lo que podría aplicar estilos en alguna herramienta de preprocesamiento o secuencia de comandos. También se debe considerar que el gráfico no es solo un árbol de análisis estático, sino que después de leer un gráfico, se puede cambiar su hoja de estilo o los atributos de los objetos a los que se han aplicado los estilos, y luego se debe escribir el gráfico. correctamente de una manera que aún conserve la estructura original tanto como sea posible. No es insuperable, pero estos son detalles que deben pensarse detenidamente.

Los errores se pueden informar en www.graphviz.org en Seguimiento de errores y problemas.

Enrutamiento de borde global con curvas suaves: problema difícil. Tenga en cuenta que muchos diseños atractivos de otras herramientas usan bordes curvos, pero simplemente dibujan sobre todo lo demás que se interpone en el camino. Creo que también agregamos esta característica a graphviz. También creo que había un documento de CHI o INFOVIS que mostraba que los bordes curvos eran un poco más difíciles de leer correctamente que las líneas rectas.

Cruces: es posible que se realice alguna optimización local. No estoy seguro de qué herramienta se está utilizando. Es fácil señalar ejemplos específicos en los que los diseños podrían ser mejores, pero es más difícil inventar una solución efectiva en la que el "número mínimo de cruces" no empeore las cosas en general.

Tenga en cuenta que estoy directamente afiliado a Graphviz.

Voté a favor. Stephen North es un reconocido experto en visualización de gráficos, y dado el ataque del OP a Graphviz, es valioso tener su perspectiva como respuesta. (Sin embargo, entiendo la frustración del OP, pero la representación gráfica es un problema difícil)

Mi recomendación de software es " yEd ", una aplicación gratuita de dibujo de gráficos de propósito general que se esfuerza mucho por resolver los problemas con los que te has estado encontrando. Hasta donde yo sé, este software utiliza las mejores implementaciones disponibles gratuitamente de los algoritmos de diseño.

Ahora a la respuesta más detallada que sería más adecuada para StackOverflow que para "Recomendación de software":

El problema que está tratando de resolver es un problema realmente difícil (especialmente en el sentido de computacionalmente difícil ), por lo que es poco probable que encuentre una herramienta que pueda resolver todos sus problemas igualmente bien. Hay una serie de soluciones gratuitas (GraphViz probablemente sea una de las mejores) y una gran cantidad de competidores comerciales. Para la biblioteca comercial de dibujo de gráficos yFiles , hay una aplicación multiplataforma gratuita (como en la cerveza) disponible, que puede probar. Puede importar datos de varios formatos diferentes, aplicar asignaciones de estilo a sus datos y ofrece una gran colección de diferentes algoritmos de diseño. Se llama yEd y se puede ejecutar sin ninguna instalación en una versión web desde aquí. La versión de escritorio se puede iniciar como una aplicación java "webstart" directamente desde el navegador o después de instalar uno de los programas independientes para Windows, Linux y Mac.

Algunos de los algoritmos de diseño probablemente no deberían usarse con gráficos muy grandes (decenas de miles de elementos), porque se ejecutarán durante mucho tiempo o requerirán demasiada memoria, pero la mayoría de las veces hay al menos un estilo de diseño que debe adaptarse bien a sus datos. Si necesita programar contra la API, necesitará licenciar la biblioteca subyacente (disponible para Java, .net, Javascript), lo cual va en contra de su requisito "gratuito", pero esto le daría aún más control sobre el diseño.

Descargo de responsabilidad : trabajo para la empresa que crea este producto (gratuito); sin embargo, en Stack Exchange no represento a mi empleador. He dedicado la mayor parte de mi tiempo académico y profesional al software de dibujo de gráficos desde finales de la década de 1990 y creo que tengo un conocimiento muy profundo sobre el mercado y el software disponible (tanto gratuito como comercial). Puede haber otras herramientas disponibles y espero que este sitio pueda brindar excelentes alternativas; ciertamente no las negaré.

+1. La solicitud OP es imposible (el programa da un gráfico con el mínimo número posible de cruces, para un gráfico grande --> NP-difícil, así que buena suerte). Esta respuesta es de calidad experta.
Yo también voté. Si alguna vez hubo un lugar en el que desea que intervengan expertos, es en problemas difíciles, y es especialmente agradable escuchar a los expertos cuando se trata de obtener software.
Para convertir de GraphViz ( .dot) a un formato que yEd pueda leer, use dotoxml .
Como usuario independiente de yEd (no afiliado a la empresa), confirmo que yEd es el mejor software gratuito disponible (y he probado muchos)

Para responder muy específicamente a la solicitud de la pregunta, ya que las otras dos respuestas hicieron un gran trabajo para expandirse:

Lo que pides no es posible. Desea un programa que proporcione un "gráfico con el mínimo número posible de cruces", y solicitó específicamente que el programa funcione para gráficos grandes.

Sin embargo, determinar el número de cruces de un gráfico es un problema NP-difícil (Garey y Johnson demostraron que es NP-completo en 1983).

Por lo tanto, un programa de este tipo no podrá garantizar encontrar el gráfico con el mínimo número posible de cruces en un tiempo razonable, lo que hace que el programa sea inútil.

Puede haber un número "razonablemente pequeño" de cruces, no un mínimo estrictamente global.

Esto ciertamente se consideraría una "solución basada en GraphViz", pero si está trabajando con GraphViz, es posible que desee consultar Gephi . Es mucho más capaz cuando se trata de procesar gráficos grandes.

PlantUML es una herramienta de código abierto que permite a los usuarios crear diagramas UML a partir de un lenguaje de texto sin formato. El lenguaje de PlantUML es un ejemplo de lenguaje específico de aplicación. Utiliza el software Graphviz para diseñar sus diagramas. Se ha utilizado para permitir que los estudiantes ciegos trabajen con UML. PlantUML también ayuda a los ingenieros de software ciegos a diseñar y leer diagramas UML.

ingrese la descripción de la imagen aquí

Lo sentimos, pero esto no es útil en absoluto. El autor solicita explícitamente un software que resuelva los problemas mejor que GraphViz. Entonces, esto obviamente descarta las soluciones basadas en GraphViz. Y los diagramas UML ciertamente tampoco son las aplicaciones típicas para "gráficos grandes". ¿Querías responder a una pregunta diferente?