Skip to content

Commit b2524ca

Browse files
committed
feat: Make the y scale's min value dynamic in some cases
1 parent 345212e commit b2524ca

6 files changed

Lines changed: 46 additions & 7 deletions

File tree

app/charts/combo/combo-line-column-state.tsx

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ import {
2828
} from "@/charts/shared/chart-state";
2929
import { TooltipInfo } from "@/charts/shared/interaction/tooltip";
3030
import { getCenteredTooltipPlacement } from "@/charts/shared/interaction/tooltip-box";
31+
import { shouldStartAtZero } from "@/charts/shared/scales";
3132
import { getTickNumber } from "@/charts/shared/ticks";
3233
import { TICK_FONT_SIZE } from "@/charts/shared/use-chart-theme";
3334
import { InteractionProvider } from "@/charts/shared/use-interaction";
@@ -106,14 +107,18 @@ const useComboLineColumnState = (
106107
scalesData,
107108
paddingData,
108109
getY: variables.y.left.getY,
109-
startAtZero: variables.y.left.chartType === "column",
110+
startAtZero:
111+
variables.y.left.chartType === "column" ||
112+
shouldStartAtZero(variables.y.left.dimension.scaleType),
110113
});
111114
const { yScale: yScaleRight, paddingYScale: paddingRightYScale } = useYScales(
112115
{
113116
scalesData,
114117
paddingData,
115118
getY: variables.y.right.getY,
116-
startAtZero: variables.y.right.chartType === "column",
119+
startAtZero:
120+
variables.y.right.chartType === "column" ||
121+
shouldStartAtZero(variables.y.right.dimension.scaleType),
117122
}
118123
);
119124
const [minLeftValue, maxLeftValue] = yScaleLeft.domain();

app/charts/combo/combo-line-dual-state.tsx

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ import {
2727
} from "@/charts/shared/chart-state";
2828
import { TooltipInfo } from "@/charts/shared/interaction/tooltip";
2929
import { getCenteredTooltipPlacement } from "@/charts/shared/interaction/tooltip-box";
30+
import { shouldStartAtZero } from "@/charts/shared/scales";
3031
import { getTickNumber } from "@/charts/shared/ticks";
3132
import { TICK_FONT_SIZE } from "@/charts/shared/use-chart-theme";
3233
import { InteractionProvider } from "@/charts/shared/use-interaction";
@@ -61,7 +62,7 @@ const useComboLineDualState = (
6162
data: ChartStateData
6263
): ComboLineDualState => {
6364
const { chartConfig } = chartProps;
64-
const { xDimension, getX, getXAsString } = variables;
65+
const { xDimension, getX, getXAsString, y } = variables;
6566
const { chartData, scalesData, timeRangeData, paddingData, allData } = data;
6667
const { fields, interactiveFiltersConfig } = chartConfig;
6768
const xKey = fields.x.componentIri;
@@ -89,12 +90,14 @@ const useComboLineDualState = (
8990
scalesData,
9091
paddingData,
9192
getY: variables.y.left.getY,
93+
startAtZero: shouldStartAtZero(y.left.dimension.scaleType),
9294
});
9395
const { yScale: yScaleRight, paddingYScale: paddingRightYScale } = useYScales(
9496
{
9597
scalesData,
9698
paddingData,
9799
getY: variables.y.right.getY,
100+
startAtZero: shouldStartAtZero(y.right.dimension.scaleType),
98101
}
99102
);
100103

app/charts/combo/combo-line-single-state.tsx

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ import {
2525
} from "@/charts/shared/chart-state";
2626
import { TooltipInfo } from "@/charts/shared/interaction/tooltip";
2727
import { getCenteredTooltipPlacement } from "@/charts/shared/interaction/tooltip-box";
28+
import { shouldStartAtZero } from "@/charts/shared/scales";
2829
import { InteractionProvider } from "@/charts/shared/use-interaction";
2930
import { ComboLineSingleConfig } from "@/configurator";
3031
import { Observation } from "@/domain/data";
@@ -97,6 +98,9 @@ const useComboLineSingleState = (
9798
scalesData,
9899
paddingData,
99100
getY: variables.y.lines.map((d) => d.getY),
101+
startAtZero: variables.y.lines.some((d) =>
102+
shouldStartAtZero(d.dimension.scaleType)
103+
),
100104
});
101105

102106
// Dimensions

app/charts/line/lines-state.tsx

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ import {
2929
} from "@/charts/shared/chart-state";
3030
import { TooltipInfo } from "@/charts/shared/interaction/tooltip";
3131
import { getCenteredTooltipPlacement } from "@/charts/shared/interaction/tooltip-box";
32+
import { getMaybeDynamicMinYScaleValue } from "@/charts/shared/scales";
3233
import useChartFormatters from "@/charts/shared/use-chart-formatters";
3334
import { InteractionProvider } from "@/charts/shared/use-interaction";
3435
import { useSize } from "@/charts/shared/use-width";
@@ -132,12 +133,18 @@ const useLinesState = (
132133
const xScaleTimeRange = scaleTime().domain(xScaleTimeRangeDomain);
133134

134135
// y
135-
const minValue = Math.min(min(scalesData, getY) ?? 0, 0);
136+
const minValue = getMaybeDynamicMinYScaleValue(
137+
yMeasure.scaleType,
138+
min(scalesData, getY)
139+
);
136140
const maxValue = max(scalesData, getY) ?? 0;
137141
const yDomain = [minValue, maxValue];
138142
const yScale = scaleLinear().domain(yDomain).nice();
139143

140-
const paddingMinValue = Math.min(min(paddingData, getY) ?? 0, 0);
144+
const paddingMinValue = getMaybeDynamicMinYScaleValue(
145+
yMeasure.scaleType,
146+
min(paddingData, getY)
147+
);
141148
const paddingMaxValue = max(paddingData, getY) ?? 0;
142149
const paddingYScale = scaleLinear()
143150
.domain([paddingMinValue, paddingMaxValue])

app/charts/scatterplot/scatterplot-state.tsx

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ import {
2020
} from "@/charts/shared/chart-state";
2121
import { TooltipInfo } from "@/charts/shared/interaction/tooltip";
2222
import { TooltipScatterplot } from "@/charts/shared/interaction/tooltip-content";
23+
import { getMaybeDynamicMinYScaleValue } from "@/charts/shared/scales";
2324
import { InteractionProvider } from "@/charts/shared/use-interaction";
2425
import { useSize } from "@/charts/shared/use-width";
2526
import { ScatterPlotConfig, SortingField } from "@/configurator";
@@ -53,6 +54,7 @@ const useScatterplotState = (
5354
const {
5455
getX,
5556
xAxisLabel,
57+
yMeasure,
5658
getY,
5759
yAxisLabel,
5860
segmentDimension,
@@ -78,12 +80,18 @@ const useScatterplotState = (
7880
const xDomain = [xMinValue, xMaxValue];
7981
const xScale = scaleLinear().domain(xDomain).nice();
8082

81-
const yMinValue = Math.min(min(scalesData, (d) => getY(d)) ?? 0, 0);
83+
const yMinValue = getMaybeDynamicMinYScaleValue(
84+
yMeasure.scaleType,
85+
min(scalesData, getY)
86+
);
8287
const yMaxValue = max(scalesData, getY) ?? 0;
8388
const yDomain = [yMinValue, yMaxValue];
8489
const yScale = scaleLinear().domain(yDomain).nice();
8590

86-
const paddingYMinValue = Math.min(min(paddingData, (d) => getY(d)) ?? 0, 0);
91+
const paddingYMinValue = getMaybeDynamicMinYScaleValue(
92+
yMeasure.scaleType,
93+
min(paddingData, getY)
94+
);
8795
const paddingYMaxValue = max(paddingData, getY) ?? 0;
8896
const paddingYScale = scaleLinear()
8997
.domain([paddingYMinValue, paddingYMaxValue])

app/charts/shared/scales.ts

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
import { ScaleType } from "@/graphql/query-hooks";
2+
3+
export const shouldStartAtZero = (scaleType: ScaleType | undefined) => {
4+
return scaleType === ScaleType.Ratio;
5+
};
6+
7+
export const getMaybeDynamicMinYScaleValue = (
8+
scaleType: ScaleType | undefined,
9+
minValue: number = 0
10+
) => {
11+
return shouldStartAtZero(scaleType) ? Math.min(0, minValue) : minValue;
12+
};

0 commit comments

Comments
 (0)