// An INTERACTIVE bar chart visualizer
// As long as label-value pairs are provided it will draw a bar chart
// Uses array initialization, and is more general in terms of
// the size of the screen, number of bars, etc.
// the labels to display under the bars
// the labels to display under the bars
String[] labels;
// the frequencies as collected during the in class survey
int[] num;
// Font stuff
PFont tnr;
void setup() {
size(800, 500);
smooth();
background(255);
fill(0);
// Read data from file
String[] lines = loadStrings("statePop2.txt");
//println(lines);
// Create data arrays
labels = new String[lines.length];
num = new int[lines.length];
// Populate them (parse the data)
for (int i=0; i < lines.length; i++) {
// First split each line using commas as separator
String[] pieces = split(lines[i], ",");
labels[i] = pieces[0];
num[i] = int(pieces[1]);
}
// Fonts
tnr = createFont("Times New Roman", 48);
} // setup()
void draw() {
background(216, 151, 46);
// set up plot dimensions relative to screen size
float x = width*0.05;
float y = height*0.75;
float delta = width*0.9/num.length;
float w = delta*0.8;
int high = max(num);
// Ticks
fill(0);
for (int i=5000000; i < high; i += 5000000) {
float x1 = width*0.05;
float x2 = width*0.95;
float yi = map(i, 0, high, y, y-height*0.65);
stroke(125, 125, 125);
line(x1, yi, x2, yi);
fill(75, 75, 75);
textSize(10);
text(i/1000000, x1-10, yi);
pushMatrix();
translate(width*0.025, height/2);
rotate(3*PI/2);
textSize(16);
fill(0);
text("Millions", 0, 0);
popMatrix();
}
// Fonts...
textFont(tnr);
for (int i = 0; i < num.length; i++) {
float h = map(num[i], 0, high, 0, height*0.65);
if (inBox(mouseX, mouseY, x, y-h, w, h)) { // Mouse interaction
//if (dist(mouseX, mouseY, x+w/2, y-h) < w/2) { // Mouse interaction
fill(255);
stroke(0);
rect(x, y-h, w, h);
textSize(36);
String msg = labels[i]+": "+(num[i]/10000)/100.0+" Million";
text(msg, (width-textWidth(msg))/2, 100 );
}
else { // no interaction
fill(0);
stroke(0);
rect(x, y-h, w, h);
}
// Draw labels for each bar
pushMatrix();
translate(x, y);
rotate(PI/2);
textSize(12);
text(labels[i], 2, 0);
popMatrix();
x += delta;
}
// Draw Title and legend
textSize(9);
fill(0);
text("Source: US Census Bureau (www.census.gov)", width-200, height-20);
text("Created by Deepak Kumar on October 29, 2013.", width-200, height-10);
textSize(24);
text("2012 US State Population Projections", width*0.05, 25);
} // draw
boolean inBox(float mx, float my, float x, float y, float w, float h) {
// test to see if moint <mx, my> is in the bounds of rect <x, y> <w,h>
return (mx > x) && (mx < x+w) && (my > y) && (my < y+h);
} // inBox()