From e89996bc27e8d35610742adcbcf97ba06b28c7c9 Mon Sep 17 00:00:00 2001 From: Henrik Giesel Date: Fri, 8 Jan 2021 00:09:12 +0100 Subject: [PATCH 1/4] Omit zero interval, and don't nice the values * to keep promise of radio buttons: * 1 month should mean 30/31 days --- ts/graphs/intervals.ts | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/ts/graphs/intervals.ts b/ts/graphs/intervals.ts index 4b4fd3661..1bd00a307 100644 --- a/ts/graphs/intervals.ts +++ b/ts/graphs/intervals.ts @@ -84,13 +84,12 @@ export function prepareIntervalData( case IntervalRange.All: break; } - const xMin = 0; + const xMin = 1; xMax = xMax! + 1; // cap bars to available range const desiredBars = Math.min(70, xMax! - xMin!); - - const scale = scaleLinear().domain([xMin!, xMax!]).nice(); + const scale = scaleLinear().domain([xMin!, xMax!]); const bins = histogram() .domain(scale.domain() as any) .thresholds(scale.ticks(desiredBars))(allIntervals); From b76639c2e3e593d849f753de7c25955370802850 Mon Sep 17 00:00:00 2001 From: Henrik Giesel Date: Fri, 8 Jan 2021 12:11:53 +0100 Subject: [PATCH 2/4] Fix cutting off of Review Interval bins --- ts/graphs/intervals.ts | 32 +++++++++++++++++++++++++------- 1 file changed, 25 insertions(+), 7 deletions(-) diff --git a/ts/graphs/intervals.ts b/ts/graphs/intervals.ts index 1bd00a307..613c809a8 100644 --- a/ts/graphs/intervals.ts +++ b/ts/graphs/intervals.ts @@ -67,32 +67,50 @@ export function prepareIntervalData( return [null, []]; } - const [_xMinOrig, origXMax] = extent(allIntervals); - let xMax = origXMax; + const xMin = 0; + let [, xMax] = extent(allIntervals); + let niceNecessary = false; // cap max to selected range switch (range) { case IntervalRange.Month: - xMax = Math.min(xMax!, 31); + xMax = Math.min(xMax!, 30); break; case IntervalRange.Percentile50: xMax = quantile(allIntervals, 0.5); + niceNecessary = true; break; case IntervalRange.Percentile95: xMax = quantile(allIntervals, 0.95); + niceNecessary = true; break; case IntervalRange.All: + niceNecessary = true; break; } - const xMin = 1; + xMax = xMax! + 1; + // do not show the zero interval + const increment = (x: number) => x + 1; + + const adjustTicks = (x: number, idx: number, ticks: number[]) => + idx === ticks.length - 1 ? [x - (ticks[0] - 1), x + 1] : x - (ticks[0] - 1); + // cap bars to available range const desiredBars = Math.min(70, xMax! - xMin!); - const scale = scaleLinear().domain([xMin!, xMax!]); + + const prescale = scaleLinear().domain([xMin!, xMax!]); + + const scale = scaleLinear().domain( + (niceNecessary ? prescale.nice() : prescale).domain().map(increment) + ); + const bins = histogram() - .domain(scale.domain() as any) - .thresholds(scale.ticks(desiredBars))(allIntervals); + .domain(scale.domain() as [number, number]) + .thresholds((scale.ticks(desiredBars) as any).flatMap(adjustTicks))( + allIntervals + ); // empty graph? const totalInPeriod = sum(bins, (bin) => bin.length); From 38a5f641502dc4cacb8144a4fc5958ed9b8caf25 Mon Sep 17 00:00:00 2001 From: Henrik Giesel Date: Fri, 8 Jan 2021 12:23:21 +0100 Subject: [PATCH 3/4] Add es2019.array to TypeScript libs, so we can use .flatten and .flatMap --- ts/graphs/card-counts.ts | 2 +- ts/graphs/intervals.ts | 4 +--- ts/tsconfig.json | 2 +- 3 files changed, 3 insertions(+), 5 deletions(-) diff --git a/ts/graphs/card-counts.ts b/ts/graphs/card-counts.ts index 7451466c1..f45bca720 100644 --- a/ts/graphs/card-counts.ts +++ b/ts/graphs/card-counts.ts @@ -197,7 +197,7 @@ export function renderCards( x.range([bounds.marginLeft, bounds.width - bounds.marginRight]); - const tableData = (data as any).flatMap((d: SummedDatum, idx: number) => { + const tableData = data.flatMap((d: SummedDatum, idx: number) => { const percent = ((d.count / xMax) * 100).toFixed(1); return d.show ? ({ diff --git a/ts/graphs/intervals.ts b/ts/graphs/intervals.ts index 613c809a8..c37363fe2 100644 --- a/ts/graphs/intervals.ts +++ b/ts/graphs/intervals.ts @@ -108,9 +108,7 @@ export function prepareIntervalData( const bins = histogram() .domain(scale.domain() as [number, number]) - .thresholds((scale.ticks(desiredBars) as any).flatMap(adjustTicks))( - allIntervals - ); + .thresholds(scale.ticks(desiredBars).flatMap(adjustTicks))(allIntervals); // empty graph? const totalInPeriod = sum(bins, (bin) => bin.length); diff --git a/ts/tsconfig.json b/ts/tsconfig.json index e359b52a0..c53d47021 100644 --- a/ts/tsconfig.json +++ b/ts/tsconfig.json @@ -3,7 +3,7 @@ "compilerOptions": { "target": "es6", "module": "es6", - "lib": ["es2016", "dom"], + "lib": ["es2016", "es2019.array", "dom"], "baseUrl": ".", "paths": { "anki/*": ["../bazel-bin/ts/lib/*"] From fac4abb0d5eb8327e66c3844cfcedf791364cf4e Mon Sep 17 00:00:00 2001 From: Henrik Giesel Date: Fri, 8 Jan 2021 12:29:22 +0100 Subject: [PATCH 4/4] Add return values to increment and adjustTicks --- ts/graphs/intervals.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/ts/graphs/intervals.ts b/ts/graphs/intervals.ts index c37363fe2..624701f60 100644 --- a/ts/graphs/intervals.ts +++ b/ts/graphs/intervals.ts @@ -92,10 +92,10 @@ export function prepareIntervalData( xMax = xMax! + 1; // do not show the zero interval - const increment = (x: number) => x + 1; + const increment = (x: number): number => x + 1; - const adjustTicks = (x: number, idx: number, ticks: number[]) => - idx === ticks.length - 1 ? [x - (ticks[0] - 1), x + 1] : x - (ticks[0] - 1); + const adjustTicks = (x: number, idx: number, ticks: number[]): number[] => + idx === ticks.length - 1 ? [x - (ticks[0] - 1), x + 1] : [x - (ticks[0] - 1)]; // cap bars to available range const desiredBars = Math.min(70, xMax! - xMin!);