PImage mapImage; Table locationTable; Table nameTable; int rowCount; Table dataTable; float dataMin = -10; float dataMax = 10; void setup() { size(640, 400); mapImage = loadImage("map.png"); locationTable = new Table("locations.tsv"); nameTable = new Table("names.tsv"); rowCount = locationTable.getRowCount(); updateTable(); PFont font = loadFont("Univers-Bold-12.vlw"); textFont(font); smooth(); noStroke(); } float closestDist; String closestText; float closestTextX; float closestTextY; void draw() { image(mapImage, 0, 0); closestDist = width*height; // abritrarily high for (int row = 0; row < rowCount; row++) { String abbrev = dataTable.getRowName(row); float x = locationTable.getFloat(abbrev, 1); float y = locationTable.getFloat(abbrev, 2); drawData(x, y, abbrev); } if (closestDist != width*height) { fill(0); textAlign(CENTER); text(closestText, closestTextX, closestTextY); } } void drawData(float x, float y, String abbrev) { float value = dataTable.getFloat(abbrev, 1); float radius = 0; if (value >= 0) { radius = map(value, 0, dataMax, 1.5, 15); fill(#333366); // blue } else { radius = map(value, 0, dataMin, 1.5, 15); fill(#ec5166); // red } ellipseMode(RADIUS); ellipse(x, y, radius, radius); float d = dist(x, y, mouseX, mouseY); if ((d < radius + 2) && (d < closestDist)) { closestDist = d; String name = nameTable.getString(abbrev, 1); closestText = name + " " + nfp(value, 0, 2); closestTextX = x; closestTextY = y-radius-4; } } void keyPressed() { if (key == ' ') { updateTable(); } } void updateTable() { dataTable = new Table("http://benfry.com/writing/map/random.cgi"); }