Graphviz

Kolejna perełka w kolekcji narzędzi na różne okazje: Graphviz - Graph Visualization Software. Dokładnie to, co prawdziwy geek lubi najbardziej — kawałek kodu źródłowego na wejściu i obrazek w jednym z wielu formatów na wyjściu.

Spłycając sprawę (bez większych wyrzutów sumienia) i ignorując podstawy teoretyczne wizualizacji grafów, można potraktować Graphviz po prostu jako sposób na automatyczne generowanie obrazków na podstawie kodu źródłowego. Zwłaszcza, że The DOT Language nie należy do szczególnie skomplikowanych, a sam kod (jak każdy jawny tekst) jest bardzo łatwy w obsłudze (w sensie dystrybucji, wersjonowania itd.). Często jest po prostu łatwiejszy i przyjaźniejszy niż dowolny format binarny. Natomiast utworzenie z niego obrazka jest wręcz banalnie proste, np. za pomocą polecenia:

dot -Tpng -o graf.png graf.dot

Grafem może tutaj być cokolwiek, np. kawałek UML-a:

digraph uml {
graph [fontname=Verdana,fontsize=8,ranksep=0.3];
node [fontname=Verdana,fontsize=10];
edge [fontname=Verdana,fontsize=10];

start [shape=circle,label="",height=0.15];
end [shape=point,label="",height=0.15,
style=filled,fillcolor=black];
action1 [shape=ellipse];
decision1 [shape=diamond];
decision2 [shape=diamond];
action2 [shape=ellipse];
action3 [shape=ellipse];

start->action1;
action1->decision1 [taillabel="goHere"];
action1->action2 [taillabel="goThere"];
action2->decision2;
decision1->action3 [label="T"];
decision1->decision2 [label="N"];
decision2->action4 [label="T"];
decision2->end [label="N"];
action3->end;
action4->end;

subgraph clusterClass {
label="class diagram";
pencolor=blue;

/* uwaga: odwrotne strzałki ze względu na konieczność
zachowania kierunku rysowania z diagramu głównego
(wartość rankdir jest globalna dla grafu) */

node [shape=record,style=filled,fillcolor="white"];
edge [arrowhead=none,arrowtail=empty,arrowsize=1.5];

grand [label="{grand| }"];
parent [label="{parent| }"];
child1 [label="{child1| }"];
child2 [label="{child2| }"];

grand->parent->{child1 child2};
}
}

Rys.1. Obrazek wyprodukowany z listingu 1

Może nawet ciekawszy, a przynajmniej bardziej praktyczny przykład — jakiś graf RDF:

digraph tarpit {
ordering=out;
node [fontname=Verdana,fontsize=9,style=filled,color=black];
edge [fontname=Verdana,fontsize=9];

page [label="http://mimas.ceti.pl/tarpit",
shape=ellipse,fillcolor="#aaffaa"];
title [label="TheTarPit",
shape=box,fillcolor="#ffd24d"];
lang [label="pl",
shape=box,fillcolor="#ffd24d"];
desc [label="smoliste grzęzawisko",
shape=box,fillcolor="#ffd24d"];
creator [label="",
shape=ellipse,fillcolor="#aaffaa"];
nick [label="MiMaS",
shape=box,fillcolor="#ffd24d"];
mbox [label="99c1a86ed2ccf30320ccfc943f89e27f7b0d24d2",
shape=box,fillcolor="#ffd24d"];

page->title [label="dc:title"];
page->desc [label="dc:description"];
page->creator [label="dc:creator"];
creator->mbox [label="foaf:mbox_sha1sum"];
creator->nick [label="foaf:nick"];
page->lang [label="dc:language"];
}

Rys.2. Obrazek wyprodukowany z listingu 2

Na stronie Graphviz można obejrzeć kilka ciekawszych przykładów. Polecam ;-)

Komentarze

#1 | 2006.04.20 21:46 | chris

Super przyklad! Dokladnie co potrzebuje. Ten graphviz to cud. Dzieki.
chris

 

Uwaga: Ze względu na bardzo intensywną działalność spambotów komentowanie zostało wyłączone po 60 dniach od opublikowania wpisu. Jeżeli faktycznie chcesz jeszcze skomentować skorzystaj ze strony kontaktowej.