Hi, for my latest college assignment I had to find a way to visualize data that is interrelated. For instance, my application generated the following data:
A --> B B --> C B --> D
And I needed a way to generate pretty graphs without too much headache!
I am already using wxPython for the application’s UI (it saved me a lot of time, and I learned a lot in the process, even implemented my own clone of the Aero Wizard layout used in Windows Vista and 7), so I tried to look for a way to integrate some other super powered library into my app. I quickly remembered a couple of projects that used Graphviz to generate visualizations of Django model definitions: DjangoGraphviz, and django-graphviz. I even hacked one of them to generate visualizations where each app had it’s own color. But these were complicated projects, because they generated some funky XML (correct me if I’m wrong) files that where later fed to graphviz and you had to mess a little with config options.
I wanted something simpler… lucky me, I stumbled into the wonderful project pydot. It was just what I needed, after a couple of experiments I could quickly generate “fantastic” visualizations with almost no extra effort. I’m using this on my Fedora 11 x86_64 box, so I just had to install pydot and easy_install handled the dependencies (it automatically downloaded and installed pyparsing), I am not sure what the requirements for Windows are… specially to get this running with py2exe, I’ll be blogging about that later.
In any case, let me provide you with a quick “getting started” tutorial guide on how this works.
Example 1: “Easy as Pie”
Ok, let’s try an easy one, suppose you have a set of data that you want to represent in a hierarchical way… Say: King, Lords and Vassals… Let’s try to graph that with as little code as we can:
Simple, huh? You should have a graph like this:
Now… that looks pretty boring, right? Let’s try something some more… colorful and with a different kind of graph.
Example 2: “Still Easy as Pie”
Ok, on the last example we made an undirected graph, let’s create a directed one now, and let’s also add some colors and labels on the edges between nodes. Say we have four nodes: A, B, C and D, were A points to B, B points to C, C points to D and D points back to A… let’s try that, ok?
That code generates this graph:
As you can see, the possibilities are endless, using the attributes you can set for each node, edge and other forms supported by the library, you can easily visualize your data that would otherwise be very hard to see.
One more thing, you can set the attributes when initializing the Node/Edge, or you can use the set_xyz method, for instance, instead of doing this:
pydot.Edge(node_d, node_a, label="and back we go again", labelfontcolor="#009933", fontsize="10.0", color="blue")
You could do this:
edge = pydot.Edge(node_d, node_a) edge.set_label("and back we go again") edge.set_labelfontcolor("#009933") edge.set_fontsize("10.0") edge.set_color("blue")
That can come in handy.
Well, I hope you found this useful as I have, and that this mini pydot tutorial helps you with this great library.
Don’t forget to visit these links:
- pydot site: http://code.google.com/p/pydot/
- graphviz site: http://www.graphviz.org/
- graphviz gallery (crazy examples here!): http://www.graphviz.org/Gallery.php
- graphviz documentation: http://www.graphviz.org/Documentation.php
- graphviz documentation on attributes: http://www.graphviz.org/doc/info/attrs.html
- link to another guy’s blog with a great example (Ben Atkin): http://benatkin.com/weblog/2009/04/27/graphing-retweets-with-python-and-graphviz/
Till next time!