Here are a few heat plots which I've generated so far from the survey data:

Sample Plots

A plot of income (in US dollars) versus birth date:

A plot of how much coding a person does is perl ("proportion") to how many years they've been programming perl:

This plot shows the concentrations of perl use within a given number of years of using perl. That is, each entry in a column is the fraction of people in that column who use perl at that proportion of their overall programming:

Tools

I created these plots by making SQL queries against the data in postgres, outputting the results to a file called foo.txt, then running create_3d_graph.pl on foo.txt. This script uses another which I wrote, and then invokes gnuplot to create the graph.

(note: these are actually named with a .txt extenions because I'm too lazy to configure my mime types.)

New, Improved Tool

This tool automates the entire process of generating heat plots (for certain common queries), including issuing the sql query.

It can even generate a series of heat plots, if you give it three columns to correlate. It uses the first column as a temporal column, and produces an html page with a javascript interface for animating the heat plots for the second-vs-third columns. (It also produces a lot of png files.)

It's also capable of normalizing the results by row or by column.

If you have feature requests, don't forget my contact page.

(note: this is actually named with a .txt extension because I'm too lazy to configure my mime types. I suggest changing it to .pl when you download it.)

Sample Queries

Here are some sample queries that I used to produce the data above. These work in postgres, I don't know how similar they are to the mysql queries.

select years_programming_perl,proportion_of_perl,count(id) from response where years_programming_perl <= 20 group by years_programming_perl,proportion_of_perl order by years_programming_perl,proportion_of_perl\g years_vs_proportion.txt

select foo.years_programming_perl,foo.proportion_of_perl,count(foo.id)::float/(select count(years_programming_perl)+1 from response where years_programming_perl = foo.years_programming_perl) as diff from response as foo where years_programming_perl <= 20 group by foo.years_programming_perl,foo.proportion_of_perl order by foo.years_programming_perl,foo.proportion_of_perl\g proportions.txt