python treemap module – PyTreeMap
aaron posted in tools on August 12th, 2010
comments:3
As part of a couple different projects I’m working (and *hoping* to release sometime soon), I’ve created/implemented a simple treemap module for python (Code here). There are a few python treemap modules already, but I couldn’t find a simple one with minimal prerequisites and that implements anything other than the “squarified layout”. Since I couldn’t find one when I was looking, I thought it might be worth releasing independently of the other work. Note that the module does not handle the actual graphing, it’s intentionally just the layout calculations (I do have pygame and jython/processing.org test implementations for the graphing, so if you’re interested in those email me).
There are many different layout algorithms for treemap graphs optimized for various features, and they have evolved over the years. This is a good page on the history of treemaps. The algorithm for this module is the “split” layout and was taken from this great paper on treemaps. Chapter 5 covers several different algorithms with their various features and implementation details.
Here’s a sample of how to use the module:
from PyTreeMap import SimpleTreeMap
# Arbitrary list of numbers
items=[1,22,43,5,78,2,5,12,32,1,55,9,12,34,54,11,8,23,42]
# Give the treemap its coordinates and title
root = SimpleTreeMap(x=0, y=0, w=100, h=100, title="RootNode")
# Add each of the items giving it a size or weight equivalent to its value
for i in items:
root.addItem(SimpleTreeMap(size=i))
# Add a couple children to two different nodes
root[1].addItem(SimpleTreeMap(size=25))
root[1].addItem(SimpleTreeMap(size=40))
root[2].addItem(SimpleTreeMap(size=25))
root[2].addItem(SimpleTreeMap(size=40))
print " [*] Setup [%s] top-level items to layout" % len(items)
root.layout()
# Iterate over treemap nodes and their children nodes
for i in root:
print " [*] Coordinates are x [%s] y [%s] w [%s] h [%s]" % i.getCoordinates()
for j in i:
print " [*] -- Child Coordinates are x [%s] y [%s] w [%s] h [%s]" % j.getCoordinates()
And this will output the following:
[*] Setup [19] top-level items to layout [*] Laying out now... [*] Coordinates are x [0.0] y [0.0] w [1.53579926455] h [14.5017095894] [*] Coordinates are x [1.53579926455] y [0.0] w [33.78758382] h [14.5017095894] [*] -- Child Coordinates are x [1.53579926455] y [0.0] w [12.9952245462] h [14.5017095894] [*] -- Child Coordinates are x [14.5310238107] y [0.0] w [20.7923592739] h [14.5017095894] [*] Coordinates are x [0.0] y [14.5017095894] w [31.6438640133] h [30.2644374039] [*] -- Child Coordinates are x [0.0] y [14.5017095894] w [12.1707169282] h [30.2644374039] [*] -- Child Coordinates are x [12.1707169282] y [14.5017095894] w [19.4731470851] h [30.2644374039] [*] Coordinates are x [31.6438640133] y [14.5017095894] w [3.67951907131] h [30.2644374039] [*] Coordinates are x [35.3233830846] y [0.0] w [38.8059701493] h [44.7661469933] [*] Coordinates are x [74.1293532338] y [0.0] w [9.53129091385] h [4.67338897183] ... (snip)
The previous output shows the x,y,w,h coordinates for each block of the graph including the child nodes. Children can be added arbitrarily deep. You can find the source for the module here.
Just so you can see what a treemap looks like, this is a random screenshot from a small project I’m hoping to release soon (ignore the colors):

Let me know if you have any feedback/improvements/etc.





