aboutsummaryrefslogtreecommitdiff
path: root/app
diff options
context:
space:
mode:
authorGertjan van den Burg <gertjanvandenburg@gmail.com>2019-09-05 16:20:21 +0100
committerGertjan van den Burg <gertjanvandenburg@gmail.com>2019-09-05 16:20:21 +0100
commit3b905a7710d9e60147e33a93238b1c0e080da8b8 (patch)
tree1737ee76788c0758cce747a5e3f5554fc3d781b9 /app
parentAdd ability to download annotations as CSV file (diff)
downloadAnnotateChange-3b905a7710d9e60147e33a93238b1c0e080da8b8.tar.gz
AnnotateChange-3b905a7710d9e60147e33a93238b1c0e080da8b8.zip
Add support for univariate datasets with missing values
Diffstat (limited to 'app')
-rw-r--r--app/static/js/makeChart.js97
1 files changed, 62 insertions, 35 deletions
diff --git a/app/static/js/makeChart.js b/app/static/js/makeChart.js
index 9b074f1..9ee0e2e 100644
--- a/app/static/js/makeChart.js
+++ b/app/static/js/makeChart.js
@@ -4,10 +4,18 @@
function preprocessData(data) {
var n = 0;
cleanData = [];
+ run = [];
for (i=0; i<data.values[0].raw.length; i++) {
d = data.values[0].raw[i];
- cleanData.push({"X": n++, "Y": d});
+ if (isNaN(d)) {
+ if (run.length > 0)
+ cleanData.push(run);
+ run = [];
+ continue;
+ }
+ run.push({"X": n++, "Y": d});
}
+ cleanData.push(run);
return cleanData;
}
@@ -26,13 +34,20 @@ function scaleAndAxis(data, width, height) {
// influenced by whether a change is big in the absolute sense.
yAxis.ticks(0);
+ var xmin = Math.min(...data.map(function(run) { return Math.min(...run.map(it => it.X)); }))
+ var xmax = Math.max(...data.map(function(run) { return Math.max(...run.map(it => it.X)); }))
+ var ymin = Math.min(...data.map(function(run) { return Math.min(...run.map(it => it.Y)); }))
+ var ymax = Math.max(...data.map(function(run) { return Math.max(...run.map(it => it.Y)); }))
+ var xExtent = [xmin, xmax];
+ var yExtent = [ymin, ymax];
+
// compute the domains for the axes
- var xExtent = d3.extent(data, function(d) { return d.X; });
+ //var xExtent = d3.extent(data, function(d) { return d.X; });
var xRange = xExtent[1] - xExtent[0];
var xDomainMin = xExtent[0] - xRange * 0.02;
var xDomainMax = xExtent[1] + xRange * 0.02;
- var yExtent = d3.extent(data, function(d) { return d.Y; });
+ //var yExtent = d3.extent(data, function(d) { return d.Y; });
var yRange = yExtent[1] - yExtent[0];
var yDomainMin = yExtent[0] - yRange * 0.05;
var yDomainMax = yExtent[1] + yRange * 0.05;
@@ -92,10 +107,13 @@ function baseChart(
width,
height);
- // Create the line object
- var lineObj = d3.line()
- .x(function(d) { return xScale(d.X); })
- .y(function(d) { return yScale(d.Y); });
+ var lineObjects = [];
+ for (let r=0; r<data.length; r++) {
+ var lineObj = new d3.line()
+ .x(function(d) { return xScale(d.X); })
+ .y(function(d) { return yScale(d.Y); });
+ lineObjects.push(lineObj);
+ }
// Initialise the zoom behaviour
var zoomObj = d3.zoom()
@@ -109,13 +127,14 @@ function baseChart(
// transform the axis
xScale.domain(transform.rescaleX(xScaleOrig).domain());
- // transform the data line
- svg.select(".line").attr("d", lineObj);
+ for (let r=0; r<data.length; r++) {
+ svg.select(".line-"+r).attr("d", lineObjects[r]);
- // transform the circles
- points.data(data)
- .attr("cx", function(d) { return xScale(d.X); })
- .attr("cy", function(d) { return yScale(d.Y); });
+ // transform the circles
+ pointSets[r].data(data[r])
+ .attr("cx", function(d) { return xScale(d.X); })
+ .attr("cy", function(d) { return yScale(d.Y); });
+ }
// transform the annotation lines (if any)
annoLines = gView.selectAll("line");
@@ -138,6 +157,8 @@ function baseChart(
// 4. line
// 5. circles with a click event
+ var zero = xScale(0);
+
// clip path
svg.append("defs")
.append("clipPath")
@@ -145,12 +166,12 @@ function baseChart(
.append("rect")
.attr("width", width - 18)
.attr("height", height)
- .attr("transform", "translate(" + 18 + ",0)");
+ .attr("transform", "translate(" + zero + ",0)");
// y axis
svg.append("g")
.attr("class", "axis axis--y")
- .attr("transform", "translate(" + 18 + ",0)")
+ .attr("transform", "translate(" + zero + ",0)")
.call(yAxis);
// x axis
@@ -178,26 +199,32 @@ function baseChart(
var gView = gZoom.append("g")
.attr("class", "view");
- // add the line to the view
- gView.append("path")
- .datum(data)
- .attr("class", "line")
- .attr("d", lineObj);
-
- // add the points to the view
- var points = gView.selectAll("circle")
- .data(data)
- .enter()
- .append("circle")
- .attr("cx", function(d) { return xScale(d.X); })
- .attr("cy", function(d) { return yScale(d.Y); })
- .attr("data_X", function(d) { return d.X; })
- .attr("data_Y", function(d) { return d.Y; })
- .attr("r", 5)
- .on("click", function(d, i) {
- d.element = this;
- return clickFunction(d, i);
- });
+ // add the line(s) to the view
+ for (let r=0; r<data.length; r++) {
+ gView.append("path")
+ .datum(data[r])
+ .attr("class", "line line-"+r)
+ .attr("d", lineObjects[r]);
+ }
+
+ var pointSets = [];
+ for (let r=0; r<data.length; r++) {
+ var wrap = gView.append("g");
+ var points = wrap.selectAll("circle")
+ .data(data[r])
+ .enter()
+ .append("circle")
+ .attr("cx", function(d) { return xScale(d.X); })
+ .attr("cy", function(d) { return yScale(d.Y); })
+ .attr("data_X", function(d) { return d.X; })
+ .attr("data_Y", function(d) { return d.Y; })
+ .attr("r", 5)
+ .on("click", function(d, i) {
+ d.element = this;
+ return clickFunction(d, i);
+ });
+ pointSets.push(points);
+ }
// handle the annotations
annotations.forEach(function(a) {