Skip to content

Commit 4fc0126

Browse files
committed
fix: area coordinates
1 parent 2936325 commit 4fc0126

File tree

7 files changed

+1987
-1917
lines changed

7 files changed

+1987
-1917
lines changed

src/components/Voronoi.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,10 +22,10 @@ export default function Voronoi<TDatum>() {
2222

2323
const handleFocus = React.useCallback(
2424
(datum: Datum<TDatum> | null) => {
25-
onFocusDatum?.(datum)
25+
getOptions().onFocusDatum?.(datum)
2626
setFocusedDatum(datum)
2727
},
28-
[onFocusDatum, setFocusedDatum]
28+
[getOptions, setFocusedDatum]
2929
)
3030

3131
const needsVoronoi =

src/seriesTypes/Area.tsx

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,14 @@ import { area, line } from 'd3-shape'
22
import React from 'react'
33

44
import { Axis, Series, Datum } from '../types'
5-
import { getX, getY, getYStart, translate } from '../utils/Utils'
5+
import {
6+
getPrimary,
7+
getSecondary,
8+
getSecondaryStart,
9+
getX,
10+
getY,
11+
translate,
12+
} from '../utils/Utils'
613
import useChartContext from '../utils/chartContext'
714
//
815
import { monotoneX } from '../utils/curveMonotone'
@@ -52,15 +59,15 @@ export default function AreaComponent<TDatum>({
5259

5360
const areaPath =
5461
area<Datum<TDatum>>(
55-
datum => getX(datum, primaryAxis, secondaryAxis) ?? NaN,
56-
datum => getYStart(datum, primaryAxis, secondaryAxis) ?? NaN,
57-
datum => getY(datum, primaryAxis, secondaryAxis) ?? NaN
62+
datum => getPrimary(datum, primaryAxis) ?? NaN,
63+
datum => getSecondaryStart(datum, secondaryAxis) ?? NaN,
64+
datum => getSecondary(datum, secondaryAxis) ?? NaN
5865
).curve(curve)(series.datums) ?? undefined
5966

6067
const linePath =
6168
line<Datum<TDatum>>(
62-
datum => getX(datum, primaryAxis, secondaryAxis) ?? NaN,
63-
datum => getY(datum, primaryAxis, secondaryAxis) ?? NaN
69+
datum => getPrimary(datum, primaryAxis) ?? NaN,
70+
datum => getSecondary(datum, secondaryAxis) ?? NaN
6471
).curve(curve)(series.datums) ?? undefined
6572

6673
return (

src/seriesTypes/Bar.tsx

Lines changed: 23 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,8 @@ import { Axis, Series } from '../types'
44
import {
55
getHeight,
66
getWidth,
7-
getX,
8-
getXStart,
9-
getY,
10-
getYStart,
7+
getRectX,
8+
getRectY,
119
translate,
1210
} from '../utils/Utils'
1311
import useChartContext from '../utils/chartContext'
@@ -46,22 +44,29 @@ export default function BarComponent<TDatum>({
4644
{series.datums.map((datum, i) => {
4745
const dataStyle = getDatumStatusStyle(datum, focusedDatum)
4846

47+
const x = getRectX(datum, primaryAxis, secondaryAxis) ?? NaN
48+
const y = getRectY(datum, primaryAxis, secondaryAxis) ?? NaN
49+
const width = getWidth(datum, primaryAxis, secondaryAxis) ?? NaN
50+
const height = getHeight(datum, primaryAxis, secondaryAxis) ?? NaN
51+
4952
return (
5053
<rect
51-
ref={el => {
52-
datum.element = el
53-
}}
54-
key={i}
55-
x={getXStart(datum, primaryAxis, secondaryAxis) ?? NaN}
56-
y={getYStart(datum, primaryAxis, secondaryAxis) ?? NaN}
57-
width={getWidth(datum, primaryAxis, secondaryAxis) ?? NaN}
58-
height={getHeight(datum, primaryAxis, secondaryAxis) ?? NaN}
59-
style={{
60-
strokeWidth: 0,
61-
...style,
62-
...style.rectangle,
63-
...dataStyle,
64-
...dataStyle.rectangle,
54+
{...{
55+
ref: el => {
56+
datum.element = el
57+
},
58+
key: i,
59+
x,
60+
y,
61+
width,
62+
height,
63+
style: {
64+
strokeWidth: 0,
65+
...style,
66+
...style.rectangle,
67+
...dataStyle,
68+
...dataStyle.rectangle,
69+
},
6570
}}
6671
/>
6772
)

src/types.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -237,6 +237,7 @@ export type AxisOptionsBase = {
237237
outerBandPadding?: number
238238
minBandSize?: number
239239
maxBandSize?: number
240+
minDomainLength?: number
240241
showGrid?: boolean
241242
// showTicks?: boolean
242243
// filterTicks?: <T extends string>(ticks: T[]) => T[]

src/utils/Utils.ts

Lines changed: 23 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -96,11 +96,7 @@ export function getSecondaryStart<TDatum>(
9696
secondaryAxis: Axis<TDatum>
9797
): number {
9898
if (secondaryAxis.stacked) {
99-
return (
100-
secondaryAxis.scale(
101-
datum.stackData?.[!secondaryAxis.isVertical ? 0 : 1] ?? NaN
102-
) ?? NaN
103-
)
99+
return secondaryAxis.scale(datum.stackData?.[0] ?? NaN) ?? NaN
104100
}
105101

106102
return secondaryAxis.scale(0) ?? NaN
@@ -111,11 +107,7 @@ export function getSecondary<TDatum>(
111107
secondaryAxis: Axis<TDatum>
112108
): number {
113109
if (secondaryAxis.stacked) {
114-
return (
115-
secondaryAxis.scale(
116-
datum.stackData?.[!secondaryAxis.isVertical ? 1 : 0] ?? NaN
117-
) ?? NaN
118-
)
110+
return secondaryAxis.scale(datum.stackData?.[1] ?? NaN) ?? NaN
119111
}
120112

121113
return secondaryAxis.scale(secondaryAxis.getValue(datum.originalDatum)) ?? NaN
@@ -128,9 +120,7 @@ export function getPrimary<TDatum>(
128120
let primary: number
129121

130122
if (primaryAxis.stacked) {
131-
primary =
132-
primaryAxis.scale(datum.stackData?.[primaryAxis.invert ? 1 : 0] ?? NaN) ??
133-
NaN
123+
primary = primaryAxis.scale(datum.stackData?.[1] ?? NaN) ?? NaN
134124
} else {
135125
primary =
136126
primaryAxis.scale(primaryAxis.getValue(datum.originalDatum)) ?? NaN
@@ -217,6 +207,26 @@ export function getYStart<TDatum>(
217207
: getSecondaryStart(datum, secondaryAxis)
218208
}
219209

210+
export function getRectX<TDatum>(
211+
datum: Datum<TDatum>,
212+
primaryAxis: Axis<TDatum>,
213+
secondaryAxis: Axis<TDatum>
214+
): number {
215+
return primaryAxis.isVertical
216+
? getSecondaryStart(datum, secondaryAxis)
217+
: getPrimaryStart(datum, primaryAxis)
218+
}
219+
220+
export function getRectY<TDatum>(
221+
datum: Datum<TDatum>,
222+
primaryAxis: Axis<TDatum>,
223+
secondaryAxis: Axis<TDatum>
224+
): number {
225+
return primaryAxis.isVertical
226+
? getPrimaryStart(datum, primaryAxis)
227+
: getSecondary(datum, secondaryAxis)
228+
}
229+
220230
export function getWidth<TDatum>(
221231
datum: Datum<TDatum>,
222232
primaryAxis: Axis<TDatum>,

src/utils/buildAxis.linear.ts

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { extent, max, min, range as d3Range } from 'd3-array'
1+
import { extent, max, median, min, range as d3Range } from 'd3-array'
22
import {
33
scaleLinear,
44
scaleLog,
@@ -251,6 +251,17 @@ function buildLinearAxis<TDatum>(
251251
shouldNice = false
252252
}
253253

254+
if (
255+
typeof options.minDomainLength === 'number' &&
256+
!(minValue === undefined || maxValue === undefined)
257+
) {
258+
const mid = median([minValue, maxValue])!
259+
const top = mid + options.minDomainLength / 2
260+
const bottom = mid - options.minDomainLength / 2
261+
maxValue = Math.max(top, maxValue)
262+
minValue = Math.min(bottom, minValue)
263+
}
264+
254265
if (typeof options.hardMin === 'number') {
255266
minValue = options.hardMin
256267
shouldNice = false

0 commit comments

Comments
 (0)