PImage mapImage; Table locationTable; Table nameTable; int rowCount; Table dataTable; float dataMin = MAX_FLOAT; float dataMax = MIN_FLOAT; void setup() { size(640, 400); mapImage = loadImage("map.png"); locationTable = new Table("locations.tsv"); nameTable = new Table("names.tsv"); rowCount = locationTable.getRowCount(); dataTable = new Table("random.tsv"); for (int row = 0; row < rowCount; row++) { float value = dataTable.getFloat(row, 1); if (value > dataMax) { dataMax = value; } if (value < dataMin) { dataMin = value; } } PFont font = loadFont("Univers-Bold-12.vlw"); textFont(font); smooth(); noStroke(); } // Global variables set in drawData() and read in draw() float closestDist; String closestText; float closestTextX; float closestTextY; void draw() { background(255); image(mapImage, 0, 0); // Use the built-in width and height variables to set the // closest distance high so it will be replaced immediately closestDist = width*height; 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); } // Use global variables set in drawData() // to draw text related to closest circle. 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); // Because the following check is done each time a new // circle is drawn, we end up with the values of the // circle closest to the mouse. if ((d < radius + 2) && (d < closestDist)) { closestDist = d; String name = nameTable.getString(abbrev, 1); closestText = name + " " + value; closestTextX = x; closestTextY = y-radius-4; } }