{
function unpack(rows, key) {
return rows.map(function(row)
{ return row[key];
});
}
var all_data = [];
var all_data_init = [];
var nbCharts = 1
var china = allSeries.filter(d => d[0] == "China")[0][1]
var last_china = china[china.length - 1][1];
var italy = allSeries.filter(d => d[0] == "Italy")[0][1]
var last_italy = italy[italy.length - 1][1];
var iran = allSeries.filter(d => d[0] == "Iran")[0][1]
var last_iran = iran[iran.length - 1][1];
var france = allSeries.filter(d => d[0] == "France")[0][1]
var last_france = france[france.length - 1][1];
var var_x = 'confirmed';
var var_y = 'recovered'
var var_z = 'deaths'
const NB_FRAMES = china.length;
var frames = d3.range(NB_FRAMES).map(function(d) { return {
name: 'frame_' + d,
data: [],
group: 'all'
};
})
var r = []
allSeries.forEach(function(e, j) {
d3.range(nbCharts).forEach(function(k, l) {
var s = d3.range(nbDates).map(d => e)
//var s = []
allSeries[j][1].map(function(d) {
s[allDates.indexOf(d[0])] = d[1]
// s.push(d[1])
})
r.push(s)
//s.forEach(function(d, i) {
// if(d == -1) {
// if(i > 0)
// s[i] = s[i-1]
// else
// s[i] = 0;
// }
//})
var x = unpack(s, 'confirmed');
var y = unpack(s, 'recovered');
var z = unpack(s, 'deaths');
// var data = {
// type: 'scatter3d',
// name: e[0],
// mode: 'lines',
// x: k == 1 ? x.map(d => 0): x,
// y: k == 2 ? y.map(d => 0): y,
// z: k == 3 ? z.map(d => 0): z,
// opacity: k > 0 ? .2: 1,
// line: {
// width: k > 0 ? 4: 8,
// color: k > 0 ? "gray": e[0] == "Italy" ? "green": e[0] == "China" ? "darkpink": color(e[0]),
// reversescale: false,
// simplify: false
// }
// }
// var data_init = {
// type: 'scatter3d',
// name: e[0],
// mode: 'lines',
// x: [0],
// y: [0],
// z: [0],
// opacity: k > 0 ? .2: 1,
// line: {
// width: k > 0 ? 4: 8,
// color: k > 0 ? "gray": e[0] == "Italy" ? "green": e[0] == "China" ? "darkpink": color(e[0]),
// reversescale: false
// }
// }
//e[0] == "China" ? all_data.push(data): null;
//e[0] == "China" ? all_data_init.push(data_init): null;
d3.range(NB_FRAMES).map(function(d) {
var data_frame = {
type: 'scatter3d',
name: e[0],
mode: 'lines',
x: x.slice(0, d),
y: y.slice(0, d),
z: z.slice(0, d),//.map(d => 0),
opacity: k > 0 ? .2: 1,
line: {
width: k > 0 ? 4: 8,
color: k > 0 ? "gray": e[0] == "Italy" ? "green": e[0] == "China" ? "darkpink": color(e[0]),
reversescale: false
}
}
// Create the frame:
frames[d].data.push(data_frame)
})
});
});
const div = DOM.element('div');
div.id = "3Dchart";
var layout = {
autosize: false,
width: 800,
height: 600,
showlegend: false,
margin: {
l: 10,
r: 0,
b: 20,
t: 30,
pad: 4
},
scene: {
// https://plot.ly/javascript/tick-formatting/
// Annotations https://plot.ly/javascript/text-and-annotations/
annotations: [{
showarrow: false,
x: last_china[var_x],
y: last_china[var_y],
z: last_china[var_z],
text: "China",
font: {
color: "black",
size: 12
},
xanchor: "left",
xshift: 10,
opacity: 0.7,
arrowcolor: "black",
arrowsize: 3,
arrowwidth: 1,
arrowhead: 1
},{
showarrow: false,
x: last_italy[var_x],
y: last_italy[var_y],
z: last_italy[var_z],
text: "Italy",
font: {
color: "black",
size: 12
},
xanchor: "left",
xshift: 10,
opacity: 0.7,
arrowcolor: "black",
arrowsize: 3,
arrowwidth: 1,
arrowhead: 1
}, {
showarrow: false,
x: last_iran[var_x],
y: last_iran[var_y],
z: last_iran[var_z],
text: "Iran",
font: {
color: "black",
size: 12
},
xanchor: "left",
xshift: 10,
opacity: 0.7,
arrowcolor: "black",
arrowsize: 3,
arrowwidth: 1,
arrowhead: 1
},{
showarrow: false,
x: last_france[var_x],
y: last_france[var_y],
z: last_france[var_z],
text: "France",
font: {
color: "black",
size: 12
},
xanchor: "left",
xshift: 10,
opacity: 0.7,
arrowcolor: "black",
arrowsize: 3,
arrowwidth: 1,
arrowhead: 1
}],
xaxis:{title: 'confirmed', //nticks: 7,
zeroline: false
},
yaxis:{title: 'recovered', zeroline: false},
zaxis:{title: 'death', zeroline: false},
},
// https://github.com/d3/d3-time-format
title: 'COVID-19 (' + formatTime(currentTime) + ', 2020)',
height: 450 * width / 700,
yaxis: {
title: 'confirmed',
}
};
Plotly.newPlot(div, frames[frames.length - 1].data, layout)
// .then(function() {
// Plotly.addFrames(div, frames);
// });
return r;
}