2011-09-24 16 views
7

Quiero crear un gráfico como el que se muestra a continuación ... pero demasiado complejo. Quiero utilizar imágenes separadas para cada uno de los nodos cuadrados y la misma imagen para cada uno de los nodos circulares.¿Graphviz es la mejor herramienta para este tipo de gráfico?

Quiero saber si usar GraphViz es la mejor opción o hay otras opciones?

Además, me gustaría saber si puedo crear un nodo de plantilla en GraphViz para el círculo y volver a utilizarlo. No quiero especificar los atributos como imagen, forma, etc. una y otra vez.

Sample Graph

Respuesta

8

Graphviz es sin duda adecuado para lo que están pidiendo. El sitio principal de graphviz.org parece estar desactivado por el momento, pero alguien ha copiado amablemente los ejemplos de la galería (con fuente) a Flickr.

http://www.flickr.com/photos/kentbye/sets/72157601523153827/

Por lo que yo sé, no se puede crear "plantillas", pero se puede hacer algo como esto para los círculos:

node[shape=circle, color=white, style=solid]; 
node1;node2;node3; 

Esto va a definir un nodo (pensar en él como un "estado" al evaluar el archivo línea por línea) y luego puede definir los nodos de su círculo en ese "estado" antes de cambiar a sus rectángulos.

Según su plataforma, también puede importar su archivo .dot y ajustarlo para su publicación. También hay una gran cantidad de generadores y conversores para el formato.

Tenga en cuenta que, si está trabajando en Mac OS X 10.7 "Lion", aún no he podido encontrar o crear una versión funcional de Graphviz. En ese caso, diría que aún no es apropiado para sus necesidades.

12

Claro, aquí está el código para dibujar el gráfico en su pregunta (y que se muestra representado por punto, a continuación).

digraph g { 
rankdir = TB; 
bgcolor = white; 

edge[arrowsize=.7, color=black]; 
node[shape=box, color=black] 

{rank=same; a, b, c}; 
{rank=same; d, e, f}; 
{rank=same; g, h}; 
{rank=same; i, j, k}; 

d[color=blue; shape=circle]; 
e[color=blue; shape=circle]; 
k[color=blue; shape=circle]; 

a -> d; 
b -> d; 
b -> e; 
c -> e; 
d -> g; 
e -> h; 
d -> i; 
d -> j; 
j -> k; 
h -> k; 
k -> f; 
} 


  1. la primera línea dígrafo es para gráfico dirigido (para los gráficos en la que los bordes tienen una dirección).

  2. La cuarta y la quinta se encuentran por encima de los atributos predeterminados para los bordes y los nodos , respectivamente. En otras palabras, una vez que haya hecho esto, solo necesita marcar (incluir atributos + valores) nodos (o bordes) que desea diseñar diferente a los valores predeterminados. Puede tener más de una "plantilla" de nodos creando subgrafos, o nodos de grupos discretos (vea el manual de puntos).

  3. rango = mismo le permite specifiy un grupo de nodos que tienen el mismo posición vertical (proporcionado rankdir se establece en TB, lo que significaba "de arriba a abajo").

  4. De forma predeterminada, el nombre del nodo (por ejemplo, a, b, c en mi gráfico) se utiliza como la etiqueta del nodo . Si no desea que esto se muestra en el gráfico rendido, apenas se fija label = ""

enter image description here

Cuestiones relacionadas