var lines = []; // array of lines
var PGHannualAvg = [50.0, 50.4, 51.7, 49.0, 51.9, 53.8, 53.6, 52.6, 54.2, 54.5, 53.2, 52.3, 54.2, 51.2, 52.9, 54.1, 51.7, 53.4, 54.1, 53.8, 52.1, 51.6, 54.5, 52.3, 53.3, 53.3, 54.6, 53.6, 54.7, 52.6, 53.2, 52.9, 51.2, 52.0, 52.8, 50.7, 53.2, 52.2, 51.9, 53.7, 50.9, 53.6, 51.7, 52.0, 51.9, 49.3, 52.7, 53.3, 51.4, 55.4, 52.6, 50.3, 52.4, 50.8, 52.8, 51.6, 51.7, 53.1, 54.7, 53.5, 53.6, 52.6, 52.1, 51.0, 51.0, 53.0, 52.8, 49.6, 52.3, 51.6, 50.7, 52.0, 51.6, 53.6, 51.4, 52.4, 54.2, 51.1, 52.3, 52.9, 53.0, 51.8, 51.7, 51.0, 51.5, 48.8, 51.8, 49.1, 50.0, 49.4, 48.2, 51.1, 50.4, 50.1, 50.3, 49.1, 49.7, 50.7, 50.8, 49.9, 52.5, 51.4, 51.1, 48.0, 49.3, 49.7, 49.4, 49.5, 49.1, 50.4, 50.5, 50.4, 50.6, 51.7, 52.3, 51.0, 50.2, 53.3, 54.2, 50.9, 51.8, 51.6, 51.8, 50.3, 50.0, 54.0, 52.0, 50.8, 52.2, 52.6, 50.3, 51.6, 51.6, 52.3, 52.0, 50.9, 51.0, 51.9, 52.8, 54.2, 51.5, 50.0, 52.5, 54.2, 53.6, 52.3, 52.4, 53.3]
var Year = [];
var numLines = PGHannualAvg.length; // number of lines total
var lineWidth = 800/numLines; // width of lines
function preload() { // loads font info
helveticaBold = loadFont('HelveticaNeueBold.ttf');
helveticaUltraLight = loadFont('HelveticaNeueUltraLight.ttf');
helveticaUltraLightObl = loadFont('HelveticaNeueUltraLightItal.ttf');
helveticaLight = loadFont('HelveticaNeueLight.ttf');
for (var i = 0; i < numLines; i++) { // pushes consecutive year info to year array
Year.push(1872 + i);
}
}
function setup() {
createCanvas(800, 400);
background(220);
useSound();
}
function soundSetup() { // oscillator setup
osc = new p5.Oscillator();
osc.amp(0.25);
osc.setType(sin);
osc.start();
}
function makeLines() { // line object constructor
for (i = 0; i < numLines; i++) {
lines[i] = { x: i*lineWidth, y: height,
temp: PGHannualAvg[i], draw: drawLines, c: chooseColor }
}
}
function drawLines(line) { // function to draw lines
noStroke();
fill(this.c());
rect(this.x, 0, lineWidth, this.y);
}
function chooseColor() { // if statements choosing colors based on temp array value
if (this.temp <= 49.0) {
return (color(0, 116, 255));
}
if (this.temp > 49.0 & this.temp <= 49.5) {
return (color(5, 4, 254));
}
if (this.temp > 49.5 & this.temp <= 50.0) {
return (color(82, 82, 254));
}
if (this.temp > 50.0 & this.temp <= 50.5) {
return (color(126, 125, 253));
}
if (this.temp > 50.5 & this.temp <= 51.0) {
return (color(183, 183, 255));
}
if (this.temp > 51.0 & this.temp <= 51.5) {
return (color(251, 245, 133));
}
if (this.temp > 51.5 & this.temp <= 52.0) {
return (color(249, 221, 13));
}
if (this.temp > 52.0 & this.temp <= 52.5) {
return (color(254, 202, 5));
}
if (this.temp > 52.5 & this.temp <= 53.0) {
return (color(254, 88, 2));
}
if (this.temp > 53.0 & this.temp <= 53.5) {
return (color(234, 2, 0));
}
if (this.temp > 53.5) {
return (color(133, 0, 0));
}
}
function playSound() { // chooses oscillator frequency based on mouse index line
var mInd = int(mouseX / lineWidth);
osc.freq(chooseSound(PGHannualAvg[mind]));
}
function chooseSound(temp) { // if statements based on temperature index
if (temp <= 49.0) {
return (70);
}
if (temp > 49.0 & temp <= 49.5) {
return (80);
}
if (temp > 49.5 & temp <= 50.0) {
return (120);
}
if (temp > 50.0 & temp <= 50.5) {
return (160);
}
if (temp > 50.5 & temp <= 51.0) {
return (200);
}
if (temp > 51.0 & temp <= 51.5) {
return (240);
}
if (temp > 51.5 & temp <= 52.0) {
return (280);
}
if (temp > 52.0 & temp <= 52.5) {
return (320);
}
if (temp > 52.5 & temp <= 53.0) {
return (360);
}
if (temp > 53.0 & temp <= 53.5) {
return (400);
}
if (temp > 53.5) {
return (440);
}
}
function drawTitle() { // draws black bar and title text
rect(0, 325, 800, 100);
fill(255);
textSize(18);
textFont(helveticaBold);
text("1872", 10, 350);
text("2020", 748, 350);
stroke(255);
line(61, 343, 738, 343);
line(732, 337, 738, 343);
line(732, 349, 738, 343);
noStroke();
text("Annual Average Temperatures: Pittsburgh", 235, 375);
}
function showMouseInfo() { // black hover rectangle with bar info
var mInd = int(mouseX / lineWidth);
noStroke();
fill(255);
if ((mouseY < 325) & (mouseX > 0) && (mouseX < width) && (mouseY > 0)) {
noFill();
stroke(255);
strokeWeight(2);
rect(mInd*lineWidth, 0, lineWidth, 325);
if (mouseX < 725) {
noStroke();
fill(0);
rect(mouseX + 20, mouseY, 65, 40);
fill(255);
textFont(helveticaBold);
text(Year[mInd], mouseX+25, mouseY+18);
textFont(helveticaLight);
text(PGHannualAvg[mInd]+"°F", mouseX+25, mouseY+34);
}
else {
noStroke();
fill(0);
rect(mouseX - 70, mouseY, 65, 40);
fill(255);
textFont(helveticaBold);
text(Year[mInd], mouseX- 65, mouseY+18);
textFont(helveticaLight);
text(PGHannualAvg[mInd]+"°F", mouseX-65, mouseY+34);
}
}
}
function draw() { // main draw function
background(0);
noStroke();
makeLines();
for (i = 0; i < numLines; i++) {
lines[i].draw();
fill(0);
}
drawTitle();
showMouseInfo();
var mInd = int(mouseX / lineWidth);
osc.freq(chooseSound(PGHannualAvg[mInd]));
}
My program is a data visualization of Pittsburgh’s fluctuating average annual temperatures over time. I took data from the historical records of the Pittsburgh International Airport weather station from 1872 through 2020. Each of the colored bars represent a year and its average temperature. The colors represent the temperatures–the warmer the color, the hotter the temperature, and vice versa. The user can use their mouse cursor to hover over the bars and view information for that particular one–the year and temperature from that year. There is also an aspect of sound–the temperatures relate to a frequency level that plays when the user hovers over the bar. The higher the temperature, the higher the frequency that is played.
Note: I used external fonts uploaded via local files and displayed using a local server, but I’m not sure how to upload those so that WordPress can run them. I tried Imgur but they don’t support TrueType font files.