// Drawing a Chart of Twitter Stock Science Majors
// The data...comes from finance.yahoo.com
// It is YTD data for 2022
// We will only use the adjClose price of the stock and plot it.
// Once done you can try to also plot the volume (as they do on Yahoo! site).
// The data arrays
float[] adjClose;
int[] volume;
float minPrice, maxPrice; // min and max price of stock YTD
// Plot dimensions
float x1, y1, x2, y2;
// Text and Fonts
PFont f;
void setup() {
size(1000, 600);
background(255);
//noLoop();
// Read data from a data file: TWTR.csv
// The data file should be downloaded as a CSV file from Yahoo! Finance
// It should be stored in the Data folder of the sketch
// Read the data file as an array of strings, each line in a string.
// First line of data is the names of each field (ignore while plotting)
String[] lines = loadStrings("TWTR.csv");
println("Read " + lines.length + " lines.");
// create data arrays
adjClose = new float[lines.length-1];
volume = new int[lines.length-1];
// Why lines.length-1??? Because we are ignoring the first line.
for (int i=1; i < lines.length; i++) {
String[] pieces = split(lines[i], ",");
adjClose[i-1] = float(pieces[5]); /// Again, ith line gets parsed into i-1th entry
volume[i-1] = int(pieces[6]);
}
// Compute min and max price of stock
minPrice = min(adjClose);
maxPrice = max(adjClose);
println("Min Price = $" + minPrice);
println("Max Price = $" + maxPrice);
// Set up lot dimensions
x1 = width*0.05;
y1 = height*0.05;
x2 = width*0.95;
y2 = height*0.95;
// Font
f = createFont("Arial", 16, true);
} // setup()
void draw() {
background(255);
rectMode(CORNERS);
noStroke();
fill(200);
rect(x1, y1, x2, y2); // draws bounding box for plot
// Draw the line chart for adjClose
drawGraph(adjClose, minPrice, maxPrice);
// Legend and axes (Adjust the text font and size as needed)
// title
fill(0);
textFont(f, 24);
textAlign(CENTER);
text("(TWTR) Twitter Inc. 2022 (up to 10/24/2022)", (x2-x1)/2, y1-5);
textFont(f, 10);
textAlign(LEFT);
text("Source: Yahoo! Finance (finance.yahoo.com)", width-250, height-10);
// y and X axis labels, ticks, etc
drawYLabels(0, 70);
drawXLabels(0, adjClose.length);
} // draw()
void drawGraph(float[] data, float yMin, float yMax) {
stroke(0);
beginShape();
for (int i = 0; i < data.length; i++) {
float x = map(i, 0, data.length-1, x1, x2);
float y = map(data[i], 0, 70, y2, y1);
vertex(x, y);
// Mouse Interaction...
if (distance(x, y, mouseX, mouseY) < 5) {
fill(255, 0, 0);
text(str(data[i]), x, y);
stroke(255, 0, 0);
line(x1, y, x, y);
stroke(0);
noFill();
}
// End of mouse interaction
}
endShape();
} // drawGraph()
void drawYLabels(int ymin, int ymax) {
// draws little tick marks at intervals of 10
// and the value at that tick
textFont(f, 10);
textAlign(CENTER);
for (int i = ymin; i <= ymax; i = i + 10) {
float y = map(i, 0, ymax, y2, y1);
text(str(i), x1-15, y);
line(x1, y, x1-5, y);
}
} // drawYLabels()
void drawXLabels(int xmin, int xmax) {
// Draws the X axis labels, and lines
textFont(f, 10);
textAlign(CENTER);
for (int i = 0; i < xmax; i = i + 10) {
float x = map(i, 0, xmax-1, x1, x2);
text(str(i), x, y2+10);
stroke(175);
line(x, y2, x, y1);
}
} // drawXLabels()
float distance(float x1, float y1, float x2, float y2) {
return sqrt((x1-x2)*(x1-x2) + (y1-y2)*(y1-y2));
} // distance()