-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathhelper-functions.js
130 lines (104 loc) · 2.82 KB
/
helper-functions.js
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
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
// --------------------------------------------------------------------
// Data processing helper functions.
// --------------------------------------------------------------------
function sum(data) {
var total = 0;
// Ensure that data contains numbers and not strings.
data = stringsToNumbers(data);
for (let i = 0; i < data.length; i++) {
total = total + data[i];
}
return total;
}
function mean(data) {
var total = sum(data);
return total / data.length;
}
function sliceRowNumbers (row, start=0, end) {
var rowData = [];
if (!end) {
// Parse all values until the end of the row.
end = row.arr.length;
}
for (i = start; i < end; i++) {
rowData.push(row.getNum(i));
}
return rowData;
}
function stringsToNumbers (array) {
return array.map(Number);
}
// --------------------------------------------------------------------
// Plotting helper functions
// --------------------------------------------------------------------
function drawAxis(layout, colour=0) {
stroke(color(colour));
// x-axis
line(layout.leftMargin,
layout.bottomMargin,
layout.rightMargin,
layout.bottomMargin);
// y-axis
line(layout.leftMargin,
layout.topMargin,
layout.leftMargin,
layout.bottomMargin);
}
function drawAxisLabels(xLabel, yLabel, layout) {
fill(0);
noStroke();
textAlign('center', 'center');
// Draw x-axis label.
text(xLabel,
(layout.plotWidth() / 2) + layout.leftMargin,
layout.bottomMargin + (layout.marginSize * 1.5));
// Draw y-axis label.
push();
translate(layout.leftMargin - (layout.marginSize * 1.5),
layout.bottomMargin / 2);
rotate(- PI / 2);
text(yLabel, 0, 0);
pop();
}
function drawYAxisTickLabels(min, max, layout, mapFunction,
decimalPlaces) {
// Map function must be passed with .bind(this).
var range = max - min;
var yTickStep = range / layout.numYTickLabels;
fill(0);
noStroke();
textAlign('right', 'center');
// Draw all axis tick labels and grid lines.
for (i = 0; i <= layout.numYTickLabels; i++) {
var value = min + (i * yTickStep);
var y = mapFunction(value);
// Add tick label.
text(value.toFixed(decimalPlaces),
layout.leftMargin - layout.pad,
y);
if (layout.grid) {
// Add grid line.
stroke(200);
line(layout.leftMargin, y, layout.rightMargin, y);
}
}
}
function drawXAxisTickLabel(value, layout, mapFunction) {
// Map function must be passed with .bind(this).
var x = mapFunction(value);
fill(0);
noStroke();
textAlign('center', 'center');
// Add tick label.
text(value,
x,
layout.bottomMargin + layout.marginSize / 2);
if (layout.grid) {
// Add grid line.
stroke(220);
line(x,
layout.topMargin,
x,
layout.bottomMargin);
}
}