diff --git a/static/index.html b/static/index.html
index 25e86b5..c945815 100644
--- a/static/index.html
+++ b/static/index.html
@@ -51,8 +51,8 @@
diff --git a/static/poopGraph.js b/static/poopGraph.js
index addbcec..ced1d7a 100644
--- a/static/poopGraph.js
+++ b/static/poopGraph.js
@@ -1,14 +1,14 @@
const startInput = document.getElementById('startDate');
const endInput = document.getElementById('endDate');
-const cutOmicronInput = document.getElementById('cutOmicron');
+const cutSpikesInput = document.getElementById('cutSpikes');
const hashParams = new URLSearchParams(window.location.hash.substring(1));
startInput.value = hashParams.get('start');
endInput.value = hashParams.get('end');
-cutOmicronInput.checked = hashParams.get('cutOmicron') === 'true';
+cutSpikesInput.checked = hashParams.get('cutSpikes') === 'true';
-const OMICRON_START_DATE = '2021-11-01';
-const OMICRON_END_DATE = '2022-02-31';
+const SPIKE_PERCENTILE = 95;
+const Y_ROUNDING = 500;
fetch('/data.json')
.then(resp => resp.json())
@@ -113,24 +113,12 @@ function extractWithErrorBars(data, region) {
return extracted;
}
-function maxExcludingOmicron(data, start, end) {
- let max = 0;
- let secondMax = 0;
- for (const row of data) {
- if (
- (start !== "" && row.x < start)
- || (end != "" && row.x > end)
- || (OMICRON_START_DATE < row.x && row.x < OMICRON_END_DATE)
- ) {
- continue;
- }
- if (row.yMax > max) {
- secondMax = max;
- max = row.yMax;
- }
- }
- // To exclude single weird outliers
- return secondMax;
+function getPercentile(data, start, end, percentile) {
+ let sorted = data
+ .filter((row) => (start === "" || row.x >= start) && (end === "" || row.x <= end))
+ .map((row) => row.yMax)
+ .sort((a,b) => a - b);
+ return sorted[Math.ceil(sorted.length*percentile/100) - 1];
}
function updateShareLink(chart, link) {
@@ -191,17 +179,11 @@ function plot(data) {
const southOptions = getOptions("South");
const updateYMax = () => {
- if (
- cutOmicronInput.checked
- && (startInput.value === "" || startInput.value < OMICRON_END_DATE)
- && (endInput.value === "" || endInput.value > OMICRON_START_DATE)
- ) {
- northOptions.scales.y.max = maxExcludingOmicron(northData, startInput.value, endInput.value);
- southOptions.scales.y.max = maxExcludingOmicron(southData, startInput.value, endInput.value);
- } else {
- northOptions.scales.y.max = null;
- southOptions.scales.y.max = null;
- }
+ const cutoffPercentile = cutSpikesInput.checked ? SPIKE_PERCENTILE : 100;
+ const rawMax = getPercentile(northData.concat(southData), startInput.value, endInput.value, cutoffPercentile);
+ const max = Y_ROUNDING * Math.ceil(rawMax / Y_ROUNDING);
+ northOptions.scales.y.max = max;
+ southOptions.scales.y.max = max;
};
updateYMax();
@@ -321,8 +303,8 @@ function plot(data) {
if (end !== '') {
params.set('end', end);
}
- if (cutOmicronInput.checked) {
- params.set('cutOmicron', 'true');
+ if (cutSpikesInput.checked) {
+ params.set('cutSpikes', 'true');
}
window.location.hash = params.toString();
};
@@ -337,7 +319,7 @@ function plot(data) {
southOptions.scales.x.max = e.target.value;
update();
});
- cutOmicronInput.addEventListener('change', (e) => {
+ cutSpikesInput.addEventListener('change', (e) => {
update();
});
const northShare = document.getElementById('northShare');