Commit 7d34be6f authored by Sven Schneider's avatar Sven Schneider
Browse files

heatmap implemented using d3 and plotly libraries as well as fixed some labels on RibbonPlot

No related merge requests found
Showing with 160 additions and 148 deletions
+160 -148
......@@ -196,18 +196,17 @@
<!-- end row -->
<div class="row">
<div class="col-xl-6">
<div class="col-xl-12">
<div class="card mb-4">
<div class="card-header">
<i class="fas fa-chart-area mr-1"></i>
2d heatmap
<i class="fas fa-globe mr-1"></i>
PLotly heatmap2d
</div>
<div class="card-body">
<div
id="heatmap2d"
width="100%"
height="40"
style="max-width: 100%; max-height: 600px"
>
<!-- Plotly chart will be drawn inside this DIV -->
</div>
......
......@@ -465,110 +465,6 @@ followNextLink(
jsonFromArr2.forEach((obj) => renameKey(obj, "1", "y"));
///////////////////////////////////////////////////
function prep2dHistogramData(jsonData) {
var resList = [];
const L = jsonData.length;
var startVal = 1;
var currentDay = 1;
var hourInMonth = 0;
var x = [];
var y = [];
var z = [];
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 hour = tmpDate.getHours();
let day = tmpDate.getUTCDate();
let month = tmpDate.getUTCMonth(); // gets the month as numeric value
if (currentDay == day) {
x.push([startVal, startVal + 1]);
y.push([hourInMonth,hourInMonth]);
z.push([jsonData[d].y, jsonData[d].y]);
hourInMonth++;
} else {
resList.push({x:x, y:y, z:z } );
var x = [];
var y = [];
var z = [];
currentMonth += 1;
startVal += 2;
hourInMonth = 0;
x.push([startVal, startVal + 1]);
y.push([hourInMonth,hourInMonth]);
z.push([jsonData[d].y, jsonData[d].y]);
}
} // end of for loop
// add results for last month as else statement will not be reached for the december
// as the condition d < L will be true before the condition currentMonth === month can be evaluated
// re-activate following line when i have more than one data point for the next month
// resList.push({x:x, y:y, z:z } );
return resList;
}
///////////////////////////////////////////////////
function prepRibbonData(jsonData) {
var resList = [];
const L = jsonData.length;
var startVal = 2;
var currentMonth = 0;
var hourInMonth = 0;
var x = [];
var y = [];
var z = [];
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 hour = tmpDate.getHours();
let month = tmpDate.getUTCMonth(); // gets the month as numeric value
if (currentMonth == month) {
x.push([startVal, startVal + 1]);
y.push([hourInMonth,hourInMonth]);
z.push([jsonData[d].y, jsonData[d].y]);
hourInMonth++;
} else {
resList.push({x:x, y:y, z:z } );
var x = [];
var y = [];
var z = [];
currentMonth += 1;
startVal += 2;
hourInMonth = 0;
x.push([startVal, startVal + 1]);
y.push([hourInMonth,hourInMonth]);
z.push([jsonData[d].y, jsonData[d].y]);
}
} // end of for loop
// add results for last month as else statement will not be reached for the december
// as the condition d < L will be true before the condition currentMonth === month can be evaluated
// re-activate following line when i have more than one data point for the next month
// resList.push({x:x, y:y, z:z } );
return resList;
}
///////////////////////////////////////////////////
let datx=[];
let daty=[];
const MONTH = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];
......@@ -690,10 +586,9 @@ followNextLink(
location.appendChild(scriptTag);
};
var preppedData = prepRibbonData(jsonFromArr2);
loadJS('js/createPlotlyPlots.js', makeRibbonPlot(preppedData), document.body);
loadJS('js/createPlotlyPlots.js', makeHeatmap(preppedData), document.body);
loadJS('js/createPlotlyPlots.js', makeRibbonPlot(jsonFromArr2), document.body);
makeHeatmap(jsonFromArr2);
///////////////////////////////////////
......
function prepRibbonData(jsonData) {
var resList = [];
const L = jsonData.length;
var startVal = 2;
var currentMonth = 0;
var hourInMonth = 0;
var x = [];
var y = [];
var z = [];
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 hour = tmpDate.getHours();
let month = tmpDate.getUTCMonth(); // gets the month as numeric value
if (currentMonth == month) {
x.push([startVal, startVal + 1]);
y.push([hourInMonth, hourInMonth]);
z.push([jsonData[d].y, jsonData[d].y]);
hourInMonth++;
} else {
resList.push({ x: x, y: y, z: z });
var x = [];
var y = [];
var z = [];
currentMonth += 1;
startVal += 2;
hourInMonth = 0;
x.push([startVal, startVal + 1]);
y.push([hourInMonth, hourInMonth]);
z.push([jsonData[d].y, jsonData[d].y]);
}
} // end of for loop
// add results for last month as else statement will not be reached for the december
// as the condition d < L will be true before the condition currentMonth === month can be evaluated
// re-activate following line when i have more than one data point for the next month
// resList.push({x:x, y:y, z:z } );
return resList;
}
function makeRibbonPlot(dat) {
preppedData = prepRibbonData(dat);
dat = preppedData;
// https://plotly.com/javascript/ribbon-plots/
var trace1 = {
x: dat[0].x,
......@@ -83,11 +133,100 @@ function makeRibbonPlot(dat) {
},
};
Plotly.newPlot("RibbonPlot", data, layout);
}
////////////////////////////////////////////////////////////
function prepHeatmapData(jsonData) {
const L = jsonData.length;
var z = [];
var hourCnt = 0;
const maxH = 24;
const incr = Math.round(L / maxH) + 1;
// span up the matrix that holds my temperature values
for (var d = 0; d < L; d += incr) {
// z.push( [...Array(incr).keys(NaN)] );
z.push(Array(incr).fill(NaN));
}
// now populate the empty (nan-filled) array with appropriate values
var cnt = 0;
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;
z[hour][day] = jsonData[idx].y;
cnt++;
if (cnt >= L) {
breakOut = true;
break;
}
}
if (breakOut)
break;
}
// window.alert(cnt);
return z;
}
function make2dHistogram(dat) {
/////////////////////////////////////
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
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
},
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
// }
]
}
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",
},
];
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++) {
......@@ -104,25 +243,4 @@ function makeRibbonPlot(dat) {
},
];
Plotly.newPlot("heatmap2d", data);
}
/////////////////////////////////////
function makeHeatmap(dat) {
var data = [
{
z: [
[1, null, 30, 50, 1],
[20, 1, 60, 80, 30],
[30, 60, 1, -10, 20],
],
x: ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday"],
y: ["Morning", "Afternoon", "Evening"],
type: "heatmap",
hoverongaps: false,
},
];
Plotly.newPlot("heatmap2d", data);
}
}
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment