aboutsummaryrefslogtreecommitdiffstats
path: root/web/plot.js
blob: b5e023fa9ff541174e278f6a32bca13befc49126 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
import './lib/d3.v7.min.js';

let POINTS = [];

const x = d3.scaleLinear([0, 350]);
const y = d3.scaleLinear([0, 120]).nice(30);

// Declare the line generator.
const line = d3.line()
  .x((d, i) => x(i))
  .y((d, i) => y(d));

const margin = 40;

const svg = d3.select('#plot');

// Add the x-axis.
const xa = svg.append('g');

// Add the y-axis.
const ya = svg.append('g');

// add the plot.
const plot = svg.append('path')
  .attr('fill', 'none')
  .attr('stroke', 'black')
  .attr('stroke-width', '2');

const sec = d3.format('02');
const min = d3.format(' ');
const minsec = v => `${min(Math.floor(v / 60))}:${sec(v % 60)}`;

const update = () => {
  x.domain([0, Math.max(POINTS.length, 120)]).nice(30);
  y.domain(d3.extent([...d3.extent(POINTS), 0, 350]));

  xa.transition().call(d3.axisBottom(x).tickFormat(minsec))
  ya.transition().call(d3.axisLeft(y))
  plot.transition().attr('d', line(POINTS));
};

export const clear = () => {
  POINTS = [];
  update();
};

export const addPoint = (temp) => {
  POINTS.push(temp);
  update();
};

const onresize = () => {
  const width = svg.node().clientWidth;
  const height = svg.node().clientHeight;
  svg
    .attr('width', width)
    .attr('height', height);

  x.range([margin, width-2*margin]);
  y.range([height-2*margin, margin]);
  xa.transition().call(d3.axisBottom(x).tickFormat(minsec))
  ya.transition().call(d3.axisLeft(y))
  plot.transition().attr('d', line(POINTS));

  xa.attr('transform', `translate(0, ${height - 2*margin})`);
  ya.attr('transform', `translate(${margin}, 0)`);
};
window.addEventListener('resize', onresize);

onresize();
update();