From ecf71f6c459f5000d8ad60c865ef98e64030d620 Mon Sep 17 00:00:00 2001 From: Sven Schneider <icedoggy@gmx.de> Date: Fri, 21 May 2021 14:35:52 +0200 Subject: [PATCH] implemented boxplot and linechart from plotly. --- index.html | 45 +++++ public/js/appChart.js | 4 +- public/js/createPlotlyPlots.js | 322 ++++++++++++++++++++++++++++++--- 3 files changed, 340 insertions(+), 31 deletions(-) diff --git a/index.html b/index.html index d0bbf38..e2761fa 100644 --- a/index.html +++ b/index.html @@ -136,6 +136,8 @@ </div> </div> + <!-- end row --> + <div class="row"> <div class="col-xl-6"> <div class="card mb-4"> @@ -174,6 +176,49 @@ </div> <!-- end row --> + + <div class="row"> + <div class="col-xl-6"> + <div class="card mb-4"> + <div class="card-header"> + <i class="fas fa-chart-area mr-1"></i> + Boxplot plotly + </div> + <div class="card-body"> + <div + id="BoxplotPlotly" + width="100%" + height="40" + > + <!-- Plotly chart will be drawn inside this DIV --> + </div> + + </div> + </div> + </div> + + <div class="col-xl-6"> + <div class="card mb-4"> + <div class="card-header"> + <i class="fas fa-chart-area mr-1"></i> + Lineplot Plotly + </div> + <div class="card-body"> + <div + id="LineplotPlotly" + width="100%" + height="40" + > + <!-- Plotly chart will be drawn inside this DIV --> + </div> + </div> + </div> + </div> + </div> + + + <!-- end row --> + <div class="row"> <div class="col-xl-12"> <div class="card mb-4"> diff --git a/public/js/appChart.js b/public/js/appChart.js index e24a3dc..83f128d 100644 --- a/public/js/appChart.js +++ b/public/js/appChart.js @@ -438,7 +438,7 @@ followNextLink( }) .then((observationArr) => { // updateLineChartAC(chart1LineTitle, observationArr); - drawHeatMapAC2(observationArr); + // drawHeatMapAC2(observationArr); ///////////// use chart.js for line chart ///// check this out : https://stackoverflow.com/questions/57343566/zoom-function-for-chart-js @@ -589,6 +589,8 @@ followNextLink( loadJS('js/createPlotlyPlots.js', makeRibbonPlot(jsonFromArr2), document.body); makeHeatmap(jsonFromArr2); + makeBoxplot(jsonFromArr2); + makeLinePlot(jsonFromArr2); /////////////////////////////////////// diff --git a/public/js/createPlotlyPlots.js b/public/js/createPlotlyPlots.js index bb8a264..f392370 100644 --- a/public/js/createPlotlyPlots.js +++ b/public/js/createPlotlyPlots.js @@ -155,9 +155,8 @@ function prepHeatmapData(jsonData) { var breakOut = false; for (var hour = 0; hour < z.length; hour++) { for (var day = 0; day < incr; day++) { - idx = (day * maxH) + hour ; - if (idx >= L) - continue; + idx = day * maxH + hour; + if (idx >= L) continue; z[hour][day] = jsonData[idx].y; cnt++; if (cnt >= L) { @@ -165,8 +164,7 @@ function prepHeatmapData(jsonData) { break; } } - if (breakOut) - break; + if (breakOut) break; } // window.alert(cnt); @@ -179,54 +177,70 @@ function prepHeatmapData(jsonData) { function makeHeatmap(dat) { z_data = prepHeatmapData(dat); - layout = { // all "layout" attributes: #layout - title: 'Inlet flow Overview of 2020 - 1st Jan - 30th Jun', // more about "layout.title": #layout-title + layout = { + // all "layout" attributes: #layout + title: "Inlet flow Overview of 2020 - 1st Jan - 30th Jun", // more about "layout.title": #layout-title showlegend: true, autosize: true, width: 1400, height: 800, - xaxis: { // all "layout.xaxis" attributes: #layout-xaxis - title: 'Number of the day of the year', - tickmode: "array", - tickvals: [0 , 31, 60, 91, 121, 152, 182], - ticktext: ["1st. Jan", "1st Feb", "1st Mar", "1st Apr", "1st May", "1st Jun", "1st Jul"], // more about "layout.xaxis.title": #layout-xaxis-title + xaxis: { + // all "layout.xaxis" attributes: #layout-xaxis + title: "Number of the day of the year", + tickmode: "array", + tickvals: [0, 31, 60, 91, 121, 152, 182], + ticktext: [ + "1st. Jan", + "1st Feb", + "1st Mar", + "1st Apr", + "1st May", + "1st Jun", + "1st Jul", + ], // more about "layout.xaxis.title": #layout-xaxis-title }, - yaxis: { + yaxis: { title: "Hours of the day", tickmode: "array", tickvals: [...Array(24).keys()], ticktext: String([...Array(24).keys()]), + }, - }, - - annotations: [ // all "annotation" attributes: #layout-annotations - // { - // text: '1st of February', // #layout-annotations-text - // x: 0, // #layout-annotations-x - // xref: 'paper', // #layout-annotations-xref - // y: 0, // #layout-annotations-y - // yref: 'paper' // #layout-annotations-yref - // } - ] -} + annotations: [ + // all "annotation" attributes: #layout-annotations + // { + // text: '1st of February', // #layout-annotations-text + // x: 0, // #layout-annotations-x + // xref: 'paper', // #layout-annotations-xref + // y: 0, // #layout-annotations-y + // yref: 'paper' // #layout-annotations-yref + // } + ], + }; var data = [ { - // z: [ [1, 20, 30 , 20], [20, 1, 60, 10 ], [30, 60, 1, 5], [1, 20, 30 , 20], [20, 1, 60, 10 ], [30, 60, 1, 5] ], + z: z_data, type: "heatmap", + colorscale: 'Portland', + zsmooth: 'none', // fast // best // none + colorbar: { + title: { + text: "Temperature (°C)", + side: "top" + } + } }, ]; Plotly.newPlot("heatmap2d", data, layout); } +////////////////////////////// + function make2dHistogram(dat) { - ////////////////////////////// // make heatmap or 2d histogram plot - - - var x = []; var y = []; for (var i = 0; i < 500; i++) { @@ -244,3 +258,251 @@ function make2dHistogram(dat) { ]; Plotly.newPlot("heatmap2d", data); } + +////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////// + +function prepBoxplotData(jsonData) { + var resList = []; + const L = jsonData.length; + var currentMonth = 0; + + var x = []; + var y = []; + + for (var d = 0; d < L; d++) { + let tmpDate = new Date(jsonData[d].x); + // let datum = tmpDate.getDate(); // gets the day of the month 1...31 + + let month = tmpDate.getUTCMonth(); // gets the month as numeric value + + if (currentMonth == month) { + y.push(jsonData[d].y); + x.push(jsonData[d].x); + } else { + resList.push({ date: x , temperature: y }); + var x = []; + var y = []; + + currentMonth += 1; + y.push(jsonData[d].y); + x.push(jsonData[d].x); + } + } + return resList; +} + +///////////////////////////////// + +function makeBoxplot(dat) { + var preppedData = prepBoxplotData(dat); + + var trace1 = { + y: preppedData[0].temperature, + type: "box", + name: "Jan", + jitter: 0.3, + pointpos: -1.8, + marker: { + color: "rgba(7,40,89,0.4)", + }, + boxpoints: "all", // suspectedoutliers // Outliers // false // all + }; + + var trace2 = { + y: preppedData[1].temperature, + type: "box", + name: "Feb", + jitter: 0.3, + pointpos: -1.8, + marker: { + color: "rgba(47,40,89 ,0.4)", + }, + boxpoints: "all", // suspectedoutliers // Outliers // false // all + }; + + var trace3 = { + y: preppedData[2].temperature, + type: "box", + name: "Mar", + jitter: 0.3, + pointpos: -1.8, + marker: { + color: "rgba(87,40,89,0.4)", + }, + boxpoints: "all", // suspectedoutliers // Outliers // false // all + }; + + var trace4 = { + y: preppedData[3].temperature, + type: "box", + name: "Apr", + jitter: 0.3, + pointpos: -1.8, + marker: { + color: "rgba(120,40,89,0.4)", + }, + boxpoints: "all", // suspectedoutliers // Outliers // false // all + }; + + var trace5 = { + y: preppedData[4].temperature, + type: "box", + name: "May", + jitter: 0.3, + pointpos: -1.8, + marker: { + color: "rgba(160,40,89,0.4)", + }, + boxpoints: "all", // suspectedoutliers // Outliers // false // all + }; + + var trace6 = { + y: preppedData[5].temperature, + type: "box", + name: "Jun", + jitter: 0.3, + pointpos: -1.8, + marker: { + color: "rgba(200,40,89,0.4)", + }, + boxpoints: "all", // suspectedoutliers // Outliers // false // all + }; + + var data = [trace1, trace2, trace3, trace4, trace5, trace6]; + + var layout = { + title: "Inlet flow Overview of 2020 - 1st Jan - 30th Jun", // more about "layout.title": #layout-title + showlegend: true, + autosize: true, + width: 700, + height: 500, + xaxis: { + title: 'Month of the year 2020', + zeroline: false + }, + yaxis: { + title: 'Temperature (°C)', + zeroline: true + }, + + }; + + Plotly.newPlot("BoxplotPlotly", data, layout); +} + + +/////////////////////////////////////////////////// + +function makeLinePlot(dat){ + + var preppedData = prepBoxplotData(dat); + + trace1 = { + type: 'scatter', + // x: [1, 2, 3, 4], + // y: [10, 15, 13, 17], + x: preppedData[0].date, + y: preppedData[0].temperature, + mode: 'lines', + name: 'Jan', + line: { + color: "rgba(7,40,89,0.4)", + width: 2 + } + }; + + trace2 = { + type: 'scatter', + // x: [1, 2, 3, 4], + // y: [12, 9, 15, 12], + x: preppedData[1].date, + y: preppedData[1].temperature, + mode: 'lines', + name: 'Feb', + line: { + color: "rgba(47,40,89,0.4)", + width: 2 + } + }; + + trace3 = { + type: 'scatter', + // x: [1, 2, 3, 4], + // y: [10, 15, 13, 17], + x: preppedData[2].date, + y: preppedData[2].temperature, + mode: 'lines', + name: 'Mar', + line: { + color: "rgba(87,40,89,0.4)", + width: 2 + } + }; + + trace4 = { + type: 'scatter', + // x: [1, 2, 3, 4], + // y: [12, 9, 15, 12], + x: preppedData[3].date, + y: preppedData[3].temperature, + mode: 'lines', + name: 'Apr', + line: { + color: "rgba(127,40,89,0.4)", + width: 2 + } + }; + + trace5 = { + type: 'scatter', + // x: [1, 2, 3, 4], + // y: [10, 15, 13, 17], + x: preppedData[4].date, + y: preppedData[4].temperature, + mode: 'lines', + name: 'May', + line: { + color: "rgba(167,40,89,0.4)", + width: 2 + } + }; + + trace6 = { + type: 'scatter', + // x: [1, 2, 3, 4], + // y: [12, 9, 15, 12], + x: preppedData[5].date, + y: preppedData[5].temperature, + mode: 'lines', + name: 'Jun', + line: { + color: "rgba(207,40,89,0.4)", + width: 2 + } + }; + + + + var layout = { + title: "Inlet flow Overview of 2020 - 1st Jan - 30th Jun", // more about "layout.title": #layout-title + showlegend: true, + autosize: true, + width: 700, + height: 500, + xaxis: { + title: 'Month of the year 2020', + zeroline: false + }, + yaxis: { + title: 'Temperature (°C)', + zeroline: true + }, + + }; + + var data = [trace1, trace2, trace3,trace4, trace5, trace6]; + + Plotly.newPlot('LineplotPlotly', data, layout); + +} \ No newline at end of file -- GitLab