FloatTable data; float dataMin, dataMax; float plotX1, plotY1; float plotX2, plotY2; float labelX, labelY; int rowCount; int columnCount; // 0=Milk, 1=Tea, 2=Coffee int currentColumn = 0; int yearMin, yearMax; int[] years; int yearInterval = 30; //ändert die Tagesintervalle in der x-Achse int volumeInterval = 10; PFont plotFont; String[] date = {"1.1.","2.1.","3.1.","4.1.","5.1.","6.1.","7.1.","8.1.","9.1.","10.1.","11.1.","12.1.","13.1.","14.1.","15.1.","16.1.","17.1.","18.1.","19.1.","20.1.","21.1.","22.1.","23.1.","24.1.","25.1.","26.1.","27.1.","28.1.","29.1.","30.1.","31.1.","1.2.","2.2.","3.2.","4.2.","5.2.","6.2.","7.2.","8.2.","9.2.","10.2.","11.2.","12.2.","13.2.","14.2.","15.2.","16.2.","17.2.","18.2.","19.2.","20.2.","21.2.","22.2.","23.2.","24.2.","25.2.","26.2.","27.2.","28.2.","1.3.","2.3.","3.3.","4.3.","5.3.","6.3.","7.3.","8.3.","9.3.","10.3.","11.3.","12.3.","13.3.","14.3.","15.3.","16.3.","17.3.","18.3.","19.3.","20.3.","21.3.","22.3.","23.3.","24.3.","25.3.","26.3.","27.3.","28.3.","29.3.","30.3.","31.3.","1.4.","2.4.","3.4.","4.4.","5.4.","6.4.","7.4.","8.4.","9.4.","10.4.","11.4.","12.4.","13.4.","14.4.","15.4.","16.4.","17.4.","18.4.","19.4.","20.4.","21.4.","22.4.","23.4.","24.4.","25.4.","26.4.","27.4.","28.4.","29.4.","30.4.","1.5.","2.5.","3.5.","4.5.","5.5.","6.5.","7.5.","8.5.","9.5.","10.5.","11.5.","12.5.","13.5.","14.5.","15.5.","16.5.","17.5.","18.5.","19.5.","20.5.","21.5.","22.5.","23.5.","24.5.","25.5.","26.5.","27.5.","28.5.","29.5.","30.5.","31.5.","1.6.","2.6.","3.6.","4.6.","5.6.","6.6.","7.6.","8.6.","9.6.","10.6.","11.6.","12.6.","13.6.","14.6.","15.6.","16.6.","17.6.","18.6.","19.6.","20.6.","21.6.","22.6.","23.6.","24.6.","25.6.","26.6.","27.6.","28.6.","29.6.","30.6.","1.7.","2.7.","3.7.","4.7.","5.7.","6.7.","7.7.","8.7.","9.7.","10.7.","11.7.","12.7.","13.7.","14.7.","15.7.","16.7.","17.7.","18.7.","19.7.","20.7.","21.7.","22.7.","23.7.","24.7.","25.7.","26.7.","27.7.","28.7.","29.7.","30.7.","31.7.","1.8.","2.8.","3.8.","4.8.","5.8.","6.8.","7.8.","8.8.","9.8.","10.8.","11.8.","12.8.","13.8.","14.8.","15.8.","16.8.","17.8.","18.8.","19.8.","20.8.","21.8.","22.8.","23.8.","24.8.","25.8.","26.8.","27.8.","28.8.","29.8.","30.8.","31.8.","1.9.","2.9.","3.9.","4.9.","5.9.","6.9.","7.9.","8.9.","9.9.","10.9.","11.9.","12.9.","13.9.","14.9.","15.9.","16.9.","17.9.","18.9.","19.9.","20.9.","21.9.","22.9.","23.9.","24.9.","25.9.","26.9.","27.9.","28.9.","29.9.","30.9.","1.10.","2.10.","3.10.","4.10.","5.10.","6.10.","7.10.","8.10.","9.10.","10.10.","11.10.","12.10.","13.10.","14.10.","15.10.","16.10.","17.10.","18.10.","19.10.","20.10.","21.10.","22.10.","23.10.","24.10.","25.10.","26.10.","27.10.","28.10.","29.10.","30.10.","31.10.","1.11.","2.11.","3.11.","4.11.","5.11.","6.11.","7.11.","8.11.","9.11.","10.11.","11.11.","12.11.","13.11.","14.11.","15.11.","16.11.","17.11.","18.11.","19.11.","20.11.","21.11.","22.11.","23.11.","24.11.","25.11.","26.11.","27.11.","28.11.","29.11.","30.11.","1.12.","2.12.","3.12.","4.12.","5.12.","6.12.","7.12.","8.12.","9.12.","10.12.","11.12.","12.12.","13.12.","14.12.","15.12.","16.12.","17.12.","18.12.","19.12.","20.12.","21.12.","22.12.","23.12.","24.12.","25.12.","26.12.","27.12.","28.12.","29.12.","30.12."}; void setup() { size(720, 405); data = new FloatTable("bienenwaage.tsv"); rowCount = data.getRowCount(); columnCount = data.getColumnCount(); years = int(data.getRowNames()); yearMin = years[0]; yearMax = years[years.length - 1]; dataMin = 0; dataMax = ceil(data.getTableMax() / volumeInterval) * volumeInterval; // Corners of the plotted time series plotX1 = 120; plotX2 = width - 80; labelX = 50; plotY1 = 60; plotY2 = height - 70; labelY = height - 25; plotFont = createFont("SansSerif", 20); textFont(plotFont); smooth(); } void draw() { background(224); // Show the plot area as a white box fill(255); rectMode(CORNERS); noStroke(); rect(plotX1, plotY1, plotX2, plotY2); drawTitle(); drawAxisLabels(); drawYearLabels(); drawVolumeLabels(); // draw the data using a long curve for (int currentColumn = 0; currentColumn < 3; currentColumn++) { noFill(); stroke(32, 128, 192); if (currentColumn > 0) { stroke (#FF4500); } if (currentColumn > 1) { stroke (#32CD32); } // balance the weight of the lines with the closeness of the data points strokeWeight(2); drawDataCurve(currentColumn); } } void drawTitle() { for (int currentColumn = 0; currentColumn < 3; currentColumn++) { textSize(20); fill(32, 128, 192); textAlign(LEFT); if (currentColumn > 0) { fill (#FF4500); textAlign(CENTER); } if (currentColumn > 1) { fill (#32CD32); textAlign(RIGHT); } String title = data.getColumnName(currentColumn); text(title, plotX1 + 20, plotY1 - 30, 600, 200); }} void drawAxisLabels() { fill(0); textSize(13); textLeading(15); textAlign(CENTER, CENTER); text("kg", labelX, (plotY1+plotY2)/2); textAlign(CENTER); text("Datum", (plotX1+plotX2)/2, labelY); fill(#32CD32); text("°C", labelX, (plotY1+plotY2)*0.8); } void drawYearLabels() { fill(0); textSize(10); textAlign(CENTER); // Use thin, gray lines to draw the grid stroke(224); strokeWeight(1); for (int row = 0; row < rowCount; row++) { if (years[row] % yearInterval == 0) { float x = map(years[row], yearMin, yearMax, plotX1, plotX2); // text(years[row], x, plotY2 + textAscent() + 10); text(date[row], x, plotY2 + textAscent() + 10); line(x, plotY1, x, plotY2); } } } int volumeIntervalMinor = 5; // Add this above setup() void drawVolumeLabels() { fill(0); textSize(10); textAlign(RIGHT); stroke(128); strokeWeight(1); for (float v = dataMin; v <= dataMax; v += volumeIntervalMinor) { if (v % volumeIntervalMinor == 0) { // If a tick mark float y = map(v, dataMin, dataMax, plotY2, plotY1); if (v % volumeInterval == 0) { // If a major tick mark float textOffset = textAscent()/2; // Center vertically if (v == dataMin) { textOffset = 0; // Align by the bottom } else if (v == dataMax) { textOffset = textAscent(); // Align by the top } text(floor(v), plotX1 - 10, y + textOffset); line(plotX1 - 4, y, plotX1, y); // Draw major tick } else { line(plotX1 - 2, y, plotX1, y); // Draw minor tick } } } } void drawDataCurve(int col) { beginShape(); for (int row = 0; row < rowCount; row++) { if (data.isValid(row, col)) { float value = data.getFloat(row, col); float x = map(years[row], yearMin, yearMax, plotX1, plotX2); float y = map(value, dataMin, dataMax, plotY2, plotY1); curveVertex(x, y); // double the curve points for the start and stop if ((row == 0) || (row == rowCount-1)) { curveVertex(x, y); } } } endShape(); }