Interoperability, at Last
Language is a very powerful way to describe behavior. Therefore even when I create pictures, instead of dragging around my mouse, I use declarative tools like GraphViz, gnuplot, and UMLGraph. These allow me to describe what I want to draw, instead of how I want the end-result to look like. The truth however is that the end-results are not always perfect. Today I realized that the state of the art has advanced to the point where I can create the drawing declaratively, and then visually polish the final drawing.
Here is an example. For an IEEE Software special-issue on development tools that I'm co-authoring we wrote a table listing the introduction date and level of abstraction of various tools. Here is an excerpt (I'm using an early draft version of the data).
# Abstraction:Year:Tool 4:1977:Make 5:1979:Lex/Yacc 6:1971:Smalltalk IDE 4:1972:SCCS 2:1973:GrepI then wrote a small awk script to convert this into gnuplot.
#!/usr/bin/awk -F:
BEGIN {
print "reset"
print "set terminal svg"
print "set output 'timeline.svg";
print "unset ytics";
print "set ylabel 'Level of Abstraction'"
print "set xlabel 'Year'"
}
!/^#/ {
# Random pertrubation by +/- 0.5
$2 += rand() - 0.5
$1 += rand() - 0.5
print "set label \"" $3 "\" at " $2 ", " $1
}
END {
print "plot [1970:2010] [0:9] -1 notitle"
print "set output 'nul'"
}
As you can see, despite the random pertrubation I introduced, many of the labels overlap. (Surprisingly, Excel 2000 can't create such a chart without either entering each label by hand, or adding a third-party add-in.)
However, I then loaded the resulting SVG file into
Inkscape.
It loaded perfectly, and I was thus able to
easily adjust the labels' positions using the mouse.
Here is the result after the fine-tuning.