tutorial example documentacion graphviz graph-layout graph-drawing

example - graphviz python



Mejorando el diseƱo de Graphviz. (4)

Algunos softwares permiten a los usuarios ajustar algoritmos de diseño en tiempo real, siempre y cuando se mueven los nodos con el mouse. Este enfoque puede ser de gran ayuda para gráficos más grandes.

Sobre todo conozco a Gephi (disclamer: soy un dev).

Tengo la parálisis de la perfección a la hora de producir algo gráfico. Si las simetrías de lo visual no se han explorado por completo, me resulta más difícil comprender lo que está sucediendo. También soy un aprendiz muy visual, y ME ENCANTA simplificar las cosas que acabo de aprender y dibujarlas en papel.

Graphviz es una buena herramienta para dibujar cosas automáticamente, pero podría ser mejor. Comencemos con un ejemplo de un buen gráfico (una máquina de estado). No importa la calidad (se puede volver a dibujar con una mejor herramienta), esta es casi perfecta, excepto que la giraría en sentido contrario a las agujas del reloj 45 grados para que la simetría sea evidente. Entonces, el lector debería dedicar menos tiempo a descubrir cómo los estados q1 y q2 son similares y en qué se diferencian. Sostengo que hay una mejor manera de representar ese diagrama, dado que no hay otras piezas gráficas junto a él.

http://gallery.hd.org/_exhibits/maths/math-finite-state-machine-DHD.gif http://gallery.hd.org/_exhibits/maths/math-finite-state-machine-DHD.gif

Ahora veamos una representación menos que perfecta:

http://linux.softpedia.com/screenshots/Graphviz_1.png http://linux.softpedia.com/screenshots/Graphviz_1.png

Esto parece algo que un graphviz generaría. Sí, los bordes son suaves, pero GAAAAWWWWD esto es innecesariamente confuso! Parece un mapa mental, no un diagrama terminado listo para el consumo. Creo que los ojos humanos CRAVE (no menos) la simetría. Sí, la jerarquía, etc. también son factores importantes.

Me sorprende que no haya mejores algoritmos disponibles. Algunas personas no son aprendices visuales en absoluto; Pueden captar conceptos abstractos leyendo símbolos. ¡Yo no!

Entonces, ¿cuál es mi pregunta? Bueno, ¿hay mejor software gratuito disponible para dibujar gráficos de pequeño a mediano? Quizás

¡Gracias!

Déjame saber cómo puedo mejorar esta publicación.

PS Tomé 10 minutos para dibujar un clon suficientemente similar en dia. Todavía no es perfecto, pero fue conveniente hacerlo porque todo se ajusta a la cuadrícula (y me perdí algunos detalles pero no tengo ganas de volver a cargar). El LR_0 necesita un "Inicio --->" que viene de arriba para que el usuario pueda captar el estado de inicio antes.

Finate State Machine http://i47.tinypic.com/315e6w6.png


Después de varios intentos de dibujar su gráfico y no obtener un diseño que considere "mejor", plantea la pregunta aquí: ¿existe "[b] etter software libre [para] dibujar gráficos de pequeño a medio". El único criterio que ha dado para evaluar los algoritmos de diseño es cuán cerca están de la "mejor manera de representar ese diagrama". "Lo mejor" por supuesto, te queda para que lo decidas.

Esto es más o menos lo mismo que intentar resolver un problema usando un lenguaje de programación dado, fallar, y luego pedir un mejor lenguaje de programación.

En el corazón de los algoritmos de dibujo de gráficos están las rutinas de optimización que generan las soluciones de evaluación ("solución" aquí se refiere a las coordenadas de cada nodo que juntas forman un diseño). Esas soluciones se evalúan de acuerdo con la minimización de un solo criterio o una serie de criterios clasificados, es decir, la minimización de uno o más atributos de la gráfica, por ejemplo, el número total de bordes que se cruzan o la suma de las distancias entre nodos (o la combinación de ambos, o alguna combinación ponderada de esos dos), o la cercanía a una configuración simétrica. Graphviz se compone de seis algoritmos de diseño diferentes (punto neato, fdp, sfdp, twopi y circo). De estos, parece que solo usaste punto; sin embargo, twopi y circo podrían haber sido mejores opciones debido a sus estrictas restricciones de simetría que parecen coincidir con su propia idea de un gráfico correctamente dibujado.

En segundo lugar, el texto de su pregunta se dirige a "gráficos" y dibujo de gráficos. Después de leer su descripción completa, no creo que su pregunta tenga nada que ver con ninguno de los dos conceptos.

Más allá de los algoritmos generales de dibujo de gráficos (como graphviz), hay una serie de algoritmos de diseño específicos de dominio, por ejemplo, diagramas de Hasse (para representar conjuntos ordenados parcialmente en la teoría de órdenes), gráficos de Barabasi-Albert (redes sin escala), y Erdos-Renyi (gráficos aleatorios). Cada uno de esos algoritmos produce un diseño gráfico basado en los criterios y las restricciones proporcionadas por el dominio; esto debería indicarle que no hay un solo "mejor" diseño en todos los dominios. Si bien usó el término "gráfico" en su pregunta, su descripción indica que su problema se relaciona con el dibujo de máquinas de estados, un tipo de gráfico altamente idiosincrásico. Los algoritmos generales de dibujo de gráficos suelen ser deficientes para dibujar gráficos especializados de este tipo porque el algoritmo no sabe nada sobre el dominio. De hecho, no conozco ningún algoritmo de diseño para los diagramas de estado, al igual que no hay uno para los diagramas de flujo (no es el mismo, pero es similar). En lo que respecta al flujo de trabajo, puede dibujar el gráfico en graphviz y luego importarlo a Omnigraffle para realizar ajustes finos. En Omnigraffle, tendrá un control preciso sobre las ubicaciones de nodos y bordes.


Hay una serie de opciones que conozco:

  • Prefuse - Tienen una versión de Java más antigua . La versión más reciente está en Flash y tiene algunos diseños agradables. Se llama Prefuse Flare . La página de demostración ilustra algunas de sus capacidades de diseño.
  • JUNG incluye una serie de opciones de diseño, así como sus potentes funciones de análisis gráfico. Hay algunos ejemplos here .
  • Networkx también incluye numerosas capacidades de diseño. Algunos de ellos se enumeran here .

TikZ genera hermosos diseños de gráficos . Puede usar un diseño manual que le permita especificar el mínimo de sugerencias, o puede solicitar un diseño automático. Los valores predeterminados son buenos, y existen ganchos para ajustar a la perfección.

Con el diseño semi-manual no tiene que declarar todos los detalles, ya que puede

  • declare los nodos como "arriba de", "abajo a la derecha de", etc. en relación con otros nodos.
  • coloque sus nodos en un ráster ingresándolos como una matriz: muy conveniente si desea dejar algunas posiciones vacías.
  • Especifique fácilmente en qué dirección los bordes deben entrar, salir, doblarse o tomar esquinas

Para el diseño automático, la biblioteca de graphdrawing de TikZ tiene algunos algoritmos bastante graphdrawing .

Aquí hay un ejemplo de diseño manual y el código TeX utilizado para obtenerlo:

/usepackage{pgf} /usepackage{tikz} /usetikzlibrary{arrows,automata} /usepackage[latin1]{inputenc} /begin{document} /begin{tikzpicture}[->,>=stealth'',shorten >=1pt,auto,node distance=2.8cm, semithick] /tikzstyle{every state}=[fill=red,draw=none,text=white] /node[initial,state] (A) {$q_a$}; /node[state] (B) [above right of=A] {$q_b$}; /node[state] (D) [below right of=A] {$q_d$}; /node[state] (C) [below right of=B] {$q_c$}; /node[state] (E) [below of=D] {$q_e$}; /path (A) edge node {0,1,L} (B) edge node {1,1,R} (C) (B) edge [loop above] node {1,1,L} (B) edge node {0,1,L} (C) (C) edge node {0,1,L} (D) edge [bend left] node {1,0,R} (E) (D) edge [loop below] node {1,1,R} (D) edge node {0,1,R} (A) (E) edge [bend left] node {1,0,R} (A); /end{tikzpicture} /end{document}