2010-02-17 38 views
18

Tengo la parálisis de la perfección cuando se trata de producir algo gráfico. Si las simetrías de lo visual no se han explorado por completo, me es 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.Mejorando el diseño de graphviz

Graphviz es una buena herramienta para dibujar cosas automáticamente, pero podría ser mejor. Comencemos con un ejemplo de un buen gráfico) en lugar de una máquina de estado). No importa la calidad (se puede volver a dibujar con una herramienta mejor) esta es casi perfecta, excepto que la giraría en sentido antihorario 45 grados para hacer que la simetría sea aparente. Entonces debería llevar al lector menos tiempo para descubrir cómo los estados q1 y q2 son similares y cómo difieren. Yo sostengo que hay una sola mejor manera de representar ese diagrama, dado que no hay otras piezas de gráfico al lado.

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 vamos a ver una representación menos que perfecto:

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

Esto parece algo un graphviz generaría. Sí, los bordes son suaves, pero GAAAAWWWD ¡esto no es innecesario! Parece un mapa mental, no un diagrama terminado listo para el consumo. Creo que los ojos humanos CREE (no menos) 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 libre disponible para dibujar gráficos pequeños a medianos? Tal vez

¡Gracias!

Dejarme saber cómo puedo mejorar esta publicación.

P.S. Me tomó 10 minutos dibujar un clon similar en dia. Todavía no es perfecto, pero fue conveniente hacerlo porque todo se ajusta a la cuadrícula (y olvidé algunos pequeños detalles, pero no tengo ganas de volver a cargarlo). El LR_0 necesita un "Inicio --->" que viene desde arriba para que el usuario pueda captar el estado inicial más pronto.

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

+3

¿Puede definir lo que significa "belleza" es en términos de código? Te sorprende que no haya algoritmos mejores, pero "mejor" no está exactamente bien definido cuando se trata de hacer gráficos arbitrarios :) Parece que anhelas la simetría, pero admites que otros prefieren enfatizar la jerarquía, bordes suaves , etc. –

+0

grahpviz tiene muchas opciones para cambiar el diseño, las líneas, etc. (aunque es casi imposible deducir de su documentación cómo funcionan las cosas). Podría, por ejemplo, intente agregar 'rankdir = LR;' al gráfico para cambiar el diseño – nos

+0

En el primer gráfico, 'LR_2' también se conecta a' LR_5' con 'SS (a)', mientras que en el segundo gráfico se conecta a otro nodo llamado ' LR_2' con 'S (A)'. – MERose

Respuesta

21

Después de varios intentos de dibujar el gráfico y de no poder conseguir un diseño que usted considere "mejor", se plantea la cuestión aquí: está ahí "[b] Software Etter libre [de] la elaboración de pequeña a -medios de medio ambiente" El único criterio que has dado para la evaluación de algoritmos de diseño es lo cerca que llegan a la '[s] mejor manera ingle para representar ese diagrama.' 'Mejor', por supuesto, te queda por decidir.

Esto es más o menos lo mismo que intentar resolver un problema usando un lenguaje de programación dado, 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 soluciones de evaluación ('solución' aquí se refiere a las coordenadas para cada nodo que juntas comprenden un diseño). Esas soluciones se evalúan de acuerdo con la minimización de un único criterio o una serie de criterios ordenados, es decir, la minimización de uno o más atributos. atributos del gráfico, 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 proximidad a una configuración simétrica. Graphviz se compone de seis algoritmos de diseño diferentes (dot 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 dibujado correctamente.

En segundo lugar, el texto de su pregunta está dirigido a "gráficos" y gráficos, después de leer su descripción completa, no creo que su pregunta tenga nada que ver con ninguno de los 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 Hasse (para representar conjuntos parcialmente ordenados en teoría de orden), gráficos Barabasi-Albert (sin escala redes), y Erdos-Renyi (gráficos al azar). Cada uno de esos algoritmos produce un diseño de gráfico basado en los criterios y las restricciones provistas por el dominio; esto debería indicarle que no hay un solo "mejor" diseño en todos los dominios. Aunque utilizó el término "gráfico" en su pregunta, su descripción indica que su problema se relaciona con dibujar máquinas de estado, un tipo de gráfico muy idiosincrásico. Los algoritmos generales de dibujo de gráficas a menudo son pobres al 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 diagramas de estado, al igual que no hay ninguno para diagramas de flujo (no es lo 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 un ajuste fino: en Omnigraffle, tendrá un control detallado sobre el nodo y las ubicaciones de los bordes.

3

Hay una serie de opciones que sé de:

  • Prefuse - Tienen una older Java version. La última versión está en Flash y tiene algunos diseños agradables. Se llama Prefuse Flare. El demo page ilustra algunas de sus capacidades de diseño.
  • JUNG incluye una serie de opciones de diseño, así como sus poderosas funciones de análisis de gráficos. Hay algunos ejemplos here.
  • Networkx también incluye numerosas capacidades de diseño. Algunos de ellos están listados here.
+1

Los diseños de NetworkX dependen principalmente de Graphviz. – gotgenes

3

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

Lo sé principalmente Gephi (disclamer: Soy un dev).

1

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

Con la disposición semimanual usted no tiene que declarar todos los detalles, porque se puede

  • nodos de declarar como 'por encima de', 'abajo a la derecha de', etc., en relación con otros nodos .
  • coloca tus nodos en un ráster ingresándolos como una matriz: muy conveniente si quieres dejar algunas posiciones vacías.
  • fácilmente especificar en qué dirección bordes deben entrar, salir, curva, o tomar esquinas

Por diseño automático, graphdrawing la biblioteca de TikZ tiene alguna pretty slick algorithms.

Aquí está un ejemplo de diseño manual y el código TeX de obtención del mismo:

example graph

\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}