Manual GraphViz

February 17, 2019 | Author: Erick Aldi | Category: Programming Language, Tecnología, Computing, Computer Programming, Software
Share Embed Donate


Short Description

Download Manual GraphViz...

Description

PRÁCTICO • Graphv Graphviz iz

Visualización de gráficos con Graphviz

KIT DEL DEL DIBUJANTE DIBUJANTE El empleo de herramientas de dibujo para crear gráficos y diagramas de forma manual puede resultar lento y complicado. La caja de herramientas Graphviz ofrece un camino más rápido. Basándose en un breve texto con la información para el gráfico, Graphviz genera rápidamente un dibujo claro.

G

rahpviz es una aplicación muy útil si necesitamos un método automatizado de generación de gráficos (véase el cuadro “Terminología”). Los usuarios de ordenador suelen ir dando tumbos cuando se trata de este tema, desde los diagramas E / R para visualizar esquemas de bases de datos hasta las estructuras jerárquicas de árbol que representan las acciones de una organización o una cadena de mando. Normalmente, la información se sitúa en cajas cuadradas que deben estar colocadas cuidadosamente, sin superponerse a otras, antes de dibujar cualquier flecha de conexión. En este tipo de desafíos destaca Graphviz: el usuario sólo tiene que especificar las relaciones entre elementos, y la herramienta devuelve, de forma automá-

46

Número 29

tica, un dibujo atractivo. No es preciso buscar un editor de gráficos en el que poder especificar las relaciones, ya que, en su lugar, Graphviz lee una descripción de texto del gráfico en un lenguaje de marcas especial (LaTeX emplea un método parecido, aunque ambos sistemas no tienen nada que ver salvo esto). Graphviz se incluye en todas las distribuciones populares de Linux desde hace años. Instalar el paquete es simple: sólo con un click en nuestro gestor de paquetes favorito. También También podemos bajar la última versión del código fuente desde su página de inicio [1], y seguir el método estándar para construir e instalar: :configure; :configure; make; make install install

WWW.LINUX

- MAGAZINE.ES

POR TIM SCHÜRMANN .

Sea cual sea la forma elegida, deberíamos tener una colección de herramientas en el disco duro cuando acabemos.

No te Olvides de Escribir Antes de comprobar las aptitudes de las herramientas de Graphviz, necesitaremos una descripción del gráfico que queremos crear. Para

Listado 1: ejemplo1.dot 01 digra digraph ph G { 02 /* El padre padre tiene tiene un hijo hijo y una hija: hija: */ 03 padre padre -> hijo; hijo; 04 padre padre -> hija; hija; 05 }

Graphviz • PRÁCTICO

Alerta Roja Si la descripción no indica lo contrario, dot creará nodos ovalados con una etiqueta con su nombre. Vamos a cambiar esto en el ejemplo añadiendo el nombre y apellido del padre y empleando rectángulos rellenos de rojo. El lenguaje dot tiene un número de atributos que nos ayudan a implementar los cambios. Para modificar uno concreto, como el color de la etiqueta, le cambiamos su valor: Figura 1: La descripción del Listado 1 crea este gráfico dirigido.

ello, debemos escribir un archivo de texto en el lenguaje dot, muy sencillo de aprender. Como ejemplo, el Listado 1 implementa un gráfico simple y directo. La descripción comienza por definir un gráfico llamado G con tres nodos:  padre, hijo e hija. Al contrario que en otros lenguajes de programación, no es necesario declararlos de forma explícita. Podemos utilizarlos directamente. La flecha especifica cuáles están conectados, y los bucles están permitidos. El siguiente apuntaría a sí mismo: padr padre e - > padr padre e

Un punto y coma opcional termina cada línea. Como puede verse a partir de la llave, la sintaxis se modeló en esto como el lenguaje C, que también es la inspiración para el sistema de comentarios al código, que emplea /* para abrir y */ para cerrar.

Empleo de Dot Para convertir esta descripción en un dibujo, necesitamos usar la herramienta dot. Es confuso, pero el programa comparte nombre con el lenguaje de etiquetado. El siguiente comando crea un archivo PNG (Figura 1): dot -Tpng ejemplo1.dot ejemplo1.dotU  -o ejemplo1.png ejemplo1.png

Además de esto, dot soporta PostScript (parámetro -Tps), JPG, Gif, Fig, SVG y un buen número de otros formatos más o menos exóticos. La salida PDF directa no está implementada todavía, pero podemos usar la herramienta GhostScript  ps2pdf  como solución provisional. No hay que olvidarse especificar el -o junto al nombre de archivo. De este modo la herramienta enviará el archivo final directamente a la consola. Lo mismo se aplica al parámetro T ; sin él, dot sólo enviará la descripción de texto del dibujo.

colo color r = red red label label = “John “John Smith” Smith”

Deberemos separar con comas los atributos y añadirlos al nombre del nodo con corchetes. En el caso del padre, la sintaxis sería como sigue: padre padre [shape [shape = box, box,U  styl style e = fill filled ed, , colo color r = red, red,U  label label = “John “John Smith” Smith”]; ];

Lo siguiente es insertar esta línea en algún lugar en el gráfico, bajo las llaves. El método recomendado es definir primero la apariencia de los nodos antes de ir a definir los extremos. Si nos ha funcionado con los nodos, podemos esperar con seguridad que funcionará para los extremos. El usuario también puede cambiar su color, su estilo de línea o añadirle etiquetas. Una vez más, todo lo que debemos hacer es añadir pares de valores en corchetes al *borde en cuestión, como en el ejemplo que sigue: padre padre -> hija hija [sty [style le = bold bold, ,U  label = “primogénit “primogénita”, a”,U  color color = blue]; blue];

Alternativas Los programas de Graphviz esperan una breve descripción del gráfico, que convertirán automáticamente en un dibujo. Esto deja al usuario pocas opciones para influir en el tipo de resultados que obtienen. Si aprecias los beneficios que puede aportarte un lenguaje descriptivo, pero prefieres tener más control granular sobre la posición y forma de cada uno de los elementos individuales del gráfico, podrías preferir uno de los competidores de Graphviz: Asymptote [2] y GLE [3], en particular, merecen especial atención. Podemos acceder a ambos desde LaTeX. Los lenguajes basados en XML, como SVG [4], siguen un método parecido; sin embargo, hay muy poco software en esta línea por ahora.

WWW.LINUX

- MAGAZINE.ES

Figura 2: Basta con un par de instrucciones de Graphviz para ponerle color rojo al nodo del padre.

El árbol genealógico se muestra en el Listado 2, y podemos ver los resultados tras pasar la descripción por dot en la Figura 2.

Uno para pa ra Todos Todos Cambiar la forma de todos los nodos en un gráfico grande puede parecer mucho trabajo. El lenguaje de etiquetado dot emplea dos palabras clave (node y edge) para facilitar la tarea. Al cambiar sus atributos, cambian los de todos los elementos del gráfico. Por ejemplo, el siguiente texto: digr digrap aph h G ( node node [shape [shape = box]; box]; ... ... )

asigna un marco rectangular a todos los nodos (a menos que el nodo individual contenga órdenes que indiquen lo contrario). La instrucción edge hace lo mismo para los extremos. Por ejemplo el código: digr digrap aph h G ( node node [shape [shape = box]; box]; ... ... )

Listado 2: ejemplo2.dot 01 digra digraph ph G { 02 padre [shape [shape = box, box, style style = filled filled, , color color = red, red, label label =”John Smith”]; 03 hija [label [label =”Petra” =”Petra”]; ]; 04 hijo[lab hijo[label el = “Patrick “Patrick”]; ”]; 05 padre padre -> hijo; hijo; 06 padre -> hija hija [styl [style e = bold, bold, label label = “first-bo “first-born”, rn”, color = blue]; 07

}

Número 29

47

PRÁCTICO • Graphv Graphviz iz

Figura 5: Los slots del Listado 5 soportan el tipo de nodos que necesitas visualizar, como funciones hash o agrupaciones. Figura 3: La descripción del Listado 3

No Dirigidos

remarca el subgráfico con los hijos.

Divisible Los subgráficos son también muy útiles. Pueden utilizarse para agrupar nodos que deberían estar juntos. El Listado 3 es un ejemplo. En este caso, hemos introducido un subgráfico que contiene al hijo y la hija. Para indicarle a dot que subraye el grupo en el resultado final, debemos colocar el prefijo cluster  delante del nombre. Los demás atributos pertenecen al subgráfico; en este caso, definen el color y la etiqueta. La Figura 3 muestra el resultado.

Clases Hasta ahora, sólo se han puesto etiquetas simples a los nodos. Sin embargo, la clase de diagramas UML a la que me refería antes necesita nodos con múltiples subdivisiones. subdivisiones. Para realizar este trabajo en dot, primero tendrás que cambiar el marco a un modo espacial: record .

Listado 3: ejemplo3.dot 01 digra digraph ph G {

Figura 4: El pequeño diagrama UML definido en el Listado 4.

node node [shape [shape = record record] ] A partir de este punto del código, dot creará una etiqueta especial para el nodo, añadiendo líneas verticales para subdividirlo en secciones múltiples:

emplea empleado do [label [label =U  “{Empleado| “{Empleado|+ + salario salario :U  int\l+ int\l+ nombre nombre : string string\l \l | U  tarea( tarea() ) : void\l void\l}” }” ] El tag \l justifica el texto, y las llaves introducen barras verticales. Esto nos da una representación más o menos perfecta de la clase UML; todo lo que necesitamos ahora son etiquetas para los extremos. En UML, las cardinalidades pueden colocarse en ambos extremos de un borde. Para esto, podemos emplear los atributos headlabel y taillabel:

02 subgraph subgraph cluster_ cluster_chil children dren { 03 style style = filled filled; ; 04 color color = lightgre lightgrey; y;

edge edge [headl [headlabe abel l = “1”, “1”, U  tailla taillabel bel = “1..*” “1..*” ]

Los gráficos dirigidos son la especialidad de dot; si necesitamos gráficos no dirigidos, podemos usar otra herramienta de la colección: neato. De nuevo, el programa espera descripciones en dot; sin embargo, sólo soporta la palabra clave  graph, en lugar de digraph. Los extremos dirigidos se convierten en no dirigidos empleando “—”. El Listado 6 muestra un ejemplo. Las Figuras 6a y 6b prsentan los diagramas creados por dot y neato. Las herramientas dot y neato emplean diferentes algoritmos de dibujo. Mientras que dot organiza los nodos jerárquicamente, neato reemplaza los extremos por tentáculos virtuales, y emplea gravedad simulada para calcular la distancia correcta entre nodos, creando así una composición simétrica. Las herramientas twopi y circo también son dignas de atención. Organizan los nodos en patrones cir-

Listado 4: Diagrama UML 01 digra digraph ph G { 02 node node [shap [shape e = recor record] d] /* se dibujan dibujan las líneas líneas vertical verticales es de la etiqueta etiqueta */ 03 edge edge [arrow [arrowhea head d = “none” “none”, , headlabe headlabel l = “1”, taillabel taillabel = “1..*” “1..*” ]

Para un ejemplo de una pequeña descripción de un diagrama UML, fijémonos en el Listado 4. La Figura 4 muestra el diagrama resultante.

04 /* las llaves llaves signif signific ican: an: dibuja dibuja una línea línea horizont horizontal, al, y no una una barra barra vertica vertical l (gira (gira la caja 90 grados)* grados)*/ /

08 hijo [label = “Patrick “Patrick”]; ”];

Slots

09 }

Un record, o registro, puede hacer mucho más que esto. El usuario puede emplear divisiones en el nodo para controlar los enlaces a múltiples nodos subsiguientes. El Listado 5 y la Figura 5 enseñan cómo funciona. Los paréntesis angulados (“< >”) marcan puntos especiales, conocidos como slots, a partir de los cuales las flechas del diagrama empiezan o terminan.

05 empl emplea eado do [lab [label el = “{Emplea “{Empleado|+ do|+ salario salario : int\l+ int\l+ name name : stri string ng\l \l | + work work() () : void\l}” void\l}” ]

05 label label = “Hijos “Hijos”; ”; 06 07 hija [label =”Petra” =”Petra”]; ];

10 11 padre padre [label [label = “John “John Smith”]; Smith”]; 12 13 padr padre e -> hija hija; ; 14 padr padre e -> hijo hijo; ; 15 }

48

Número 29

WWW.LINUX

- MAGAZINE.ES

06 corporac corporacion ion [label [label = “{Corpor “{Corporacio acion| n| | + pagarsal pagarsalario ario() () : void\l}” void\l}” ] empleado empleado -> corporac corporacion ion 07 }

Graphviz • PRÁCTICO

necesitamos, siempre podremos crear un programa C para acceder a las funciones de la librería Graphviz. Esta librería tiene algunas muy prácticas para compilar archivos basados en texto en forFigura 6a: El gráfico no dirigido del Listado 6, renderizado por dot. mato dot y proyectar los culares; para más detalles de los algoritresultados sobre una estructura de datos mos que hacen esto, puede ojearse la designada explícitamente para este propósito. documentación de Graphviz [5]. También podemos manipular gráficos en memoria y mostrar los resultados. El proTuberías y Filtros grama que aparece en el Listado 7 ofrece un Con una ayudita de tuberías y filtros, la herrabreve ejemplo: Compila un texto con mienta de línea de comandos dot también comandos dot, dibuja un gráfico con una puede emplearse para programar, o integrado pequeña ayuda del algoritmo dot y muestra en otros programas en Linux. Para ello, debeel resultado en pantalla. De hecho, el remos preparar primero la descripción del grámismo dot está construido de un modo fico en un búfer de texto, pasarlo a dot y utilisimilar. zar el resultado. Un guión shell podría funcioExisten unos cuantos programas de ejemnar de esta forma, por ejemplo: plo en el directorio dot.demo que viene con el paquete del código fuente. La página web de echo echo *digra *digraph ph G (padre (padre -> hijo; hijo;U  Graphviz incluye referencias exhaustivas para padre padre -> hija;}* hija;}* | U  API. Si empleamos API para nuestro trabajo de desarrollo, nótese que las librerías aparedot -Tpng -Tpng > ejempl ejemplo7. o7.png png cen bajo licencia Common Public. Aquí vemos que la salida de dot está, simpleConclusiones mente, redireccionada a un archivo; por supuesto, éste podría ser otro guión shell o Una vez que nos hayamos acostumbrado código, para procesamiento posterior posterio r. a los términos del lenguaje de descripEl editor gráfico, dotty, funciona del mismo modo. No es particularmente cómodo, pero permitirá crear gráficos con un click de ratón. Si todas estas opciones no ofrecen lo que

Listado 5: Uniones Complejas

07 hija hija [ label label =” | Hija | ” ”]; ]; 08 09 “padre “padre”: ”:cen cente ter r -> “son”: “son”: left;

02 03 int int main main() () 04 { 05 GVC_t GVC_t *cont *context ext; ; 06 graph_ graph_t t *graph *graph; ; 07 FILE FILE *fp *fp; ; 08 09 contex context t = gvCon gvContex text( t(); ); 10 fp = fopen( fopen(“ej “ejemp emplo. lo.dot dot”, ”, “r”); 11 graph graph = agread agread(f (fp); p); /* Compila Compila gráfico gráfico */ 12 gvLayout gvLayout(con (context text, , graph, graph, “dot”); “dot”); /*Crear capa con el algor algoritm itmo o de dot dot */ 13 gvRender gvRender(con (context text, , graph, graph, “png”, “png”, stdout); stdout); /* Muestra Muestra gráfico gráfico en pantalla pantalla en formato formato PNG */

16 agclose( agclose(grap graph); h);

03 node node [shape [shape = record record]; ];

06 hijo hijo [ label label =” | Hijo | ” ”]; ];

01 #include #include

15 gvFreeLay gvFreeLayout( out(cont context, ext, graph);

02 {

05 padr padre e [ labe label l =” | Padre Padre | ” ”]; ];

Listado 7: API en C con Graphviz

14 /* Limp Limpia ia */ */

01 digrap digraph h G

04 /* Los “Puert “Puertos” os” se muestr muestran an con corchete corchetes s */

ción de gráficos, dot, apreciaremos las herramientas del paquete Graphviz. Es difícil encontrar un método más rápido de crear gráficos. Gracias a las tuberías y filtros, dot y compañía son fáciles de integrar con otras secuencias y guiones de shell. Además, si el paquete no termina de gustarnos, siempre podemos buscar en el cuadro “Alternativas” para algunos similares. I

Figura 6b: El gráfico no dirigido del Listado 6, renderizado por neato.

Listado 6: Gráficos no Dirigidos 01 graph G {

17 gvFreeCon gvFreeContext text(con (context text); ); 18 } RECURSOS [1] Pági Página na de de Graphviz: Graphviz: http:// www. graphviz. org 

02 server server [lab [label el = “Serv “Servid idor or principal Leo”];

[2] Pági Página na de Asympt Asymptote: ote: http:// 

03

[3] Pág Página ina de de GLE: http://www http://www.. gle-gra- 

04 serve server r — client cliente_s e_smit mith h 05 serve server r — client cliente_ e_mil miller ler; ;

10 “padre “padre”:c ”:cent enter er -> “hija”:right;

06 serve server r — client cliente_t e_turn urner; er;

11 }

08 }

07 serve server r — cliente_ cliente_mei meier; er;

WWW.LINUX

asymptote. sourceforge. net  phics. org  [4] Espec Especificac ificaciones iones del formato formato SVG: http:// www. w3. org/ Graphics/ SVG/  [5] Info Informació rmación n sobre los algoritmos algoritmos usados por Graphviz: http://www. graphviz. org/Documentation.php 

- MAGAZINE.ES

Número 29

49

View more...

Comments

Copyright ©2017 KUPDF Inc.
SUPPORT KUPDF