For this week’s task, I reused some modified code from the previous week’s task. I tried to make some sort of data visualization that compares the popularity of google searches on some celebrities’ names before their death and on the month of their death. I originally planned to take the mean of all months prior to their death, but I realized that would result in very low values consistently. I decided to consider only the highest month prior to their death and the month of their death. This resulted in some variety in the data. Below is a video of the visualization:
Whenever the mouse cursor hovers over one of the sections, that section displays the data on the month of death. Otherwise, the data prior to death is always displayed.
Challenges:
My PC randomly shut down twice while working on my code. I forgot to save my code on both times. Saving code periodically is a good habit.
Wait, is Wade Boggs dead?
No, interestingly though, the frequency of google searches on his name was highest the month this episode was released.
Code:
PFont font; color bgcolor1; color bgcolor2; color bblclr; int sections, bblcnt; Thing bbls[][][]; Table table; float diameter[][]; void setup() { size(800, 402); font = createFont("Franklin Gothic Heavy", 80); bgcolor1 = color(1, 148, 154); bgcolor2 = color(219,31,72); bblclr = color(209,202,185); sections = 3; bblcnt = 20; bbls = new Thing[sections][2][bblcnt]; diameter = new float[sections][2]; diameter[0] = loadData("alextrebek.csv", "2020-11"); diameter[1] = loadData("wadeboggs.csv", "2015-01"); diameter[2] = loadData("reckful.csv", "2020-07"); for (int i=0; i<sections; i++) { for (int j=0; j<2; j++) { diameter[i][j] = map(diameter[i][j],1,100,1,80); } } for (int i=0; i<sections; i++) { for (int j=0; j<bblcnt; j++) { float ymin = i*(height/sections); float ymax = (i+1)*(height/sections); //float d = random(20,40); //temporary, replace with mean bbls[i][0][j] = new Thing(ymin,ymax,diameter[i][0],bblclr,false); bbls[i][1][j] = new Thing(ymin,ymax,diameter[i][1],bblclr,true); } } } void draw() { background(bgcolor1); fill(bgcolor2); noStroke(); rect(0, height/3, width, height/3); for (int i=0; i<sections; i++) { for (int j=0; j<bblcnt; j++) { bbls[i][0][j].display(); bbls[i][1][j].display(); } } textAlign(CENTER, TOP); textSize(70); textFont(font); fill(bgcolor1); text("Alex Trebek", width/2, 20); textAlign(CENTER, TOP); textSize(70); textFont(font); fill(bgcolor2); text("Wade Boggs", width/2, 20+(height/3)); textAlign(CENTER, TOP); textSize(70); textFont(font); fill(bgcolor1); text("Reckful", width/2, 20+(2*height/3)); } float[] loadData(String file, String last) { table = loadTable(file, "header"); float result[] = {0,0}; for (int i=0; i<table.getRowCount(); i++) { TableRow row = table.getRow(i); String month = row.getString("month"); float frequency = row.getFloat("frequency"); if (month.equals(last)) { result[1] = frequency; break; } if (result[0] < frequency) { result[0] = frequency; } } return result; }
class Thing { float x, y; float y_min, y_max; float diameter; float ty; float speed; color bc; float alpha; boolean active; Thing(float ymin, float ymax, float d, color bubbleColor, boolean state) { diameter = d; x = -diameter/2; y = random(ymin+(diameter/2), ymax-(diameter/2)); ty=random(0, 10000); speed = random(1, 3); y_min = ymin; y_max = ymax; bc = bubbleColor; alpha = 0; active = state; } void motion() { y = map(noise(ty), 0, 1, y_min+(diameter/2), y_max-(diameter/2)); x += speed; ty += 0.02; } void reposition() { if (x >= width+diameter/2) { x = -diameter/2; } } //float getAlpha() { // return alpha; //} //void setAlpha(float a) { // if (a >=0 && a <= 255) { // alpha = a; // } else if (a < 0) { // a = 0; // } else if (a > 255) { // alpha = 255; // } //} void resetAlpha() { if (!active && (mouseY <= y_max && mouseY >= y_min)) { if (alpha >=10) { alpha -= 10; } else { alpha = 0; } } else if (!active && (mouseY > y_max || mouseY < y_min)) { if (alpha < 170) { alpha += 10; } } if (active && (mouseY <= y_max && mouseY >= y_min)) { if (alpha < 170) { alpha += 10; } } else if (active && (mouseY > y_max || mouseY < y_min)) { if (alpha >=10) { alpha -= 10; } else { alpha = 0; } } } void display() { fill(bc, alpha); motion(); noStroke(); ellipse(x, y, diameter, diameter); reposition(); resetAlpha(); } }
Nice job Ziyad, I like the flowing circles. I think maybe adding a little stroke outline to the words would be helpful. The bottom one looks like there is no name there when not highlighted since there were so few searches (I’m guessing). I had to look at it for a long time before I realized it wasn’t a mistake in the program. Even when things aren’t actually mistakes, when designing stuff, we have to account for things being perceived as mistakes too.