Skip to content

Commit a006641

Browse files
committed
feat: 参考数据计算实现
1 parent e056034 commit a006641

File tree

8 files changed

+235
-118
lines changed

8 files changed

+235
-118
lines changed

docs/custom/demo/TrendArea/basic.tsx

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -33,17 +33,11 @@ function Example() {
3333
]}
3434
tooltip={{
3535
dimension: {
36-
title: {
37-
value: (datum) => {
38-
return `${datum?.date}:00 ~ ${datum?.date + 1}:00`;
39-
},
40-
},
4136
content: {
4237
key: '出行次数',
4338
value: (datum) => {
4439
return datum?.value;
4540
},
46-
valueFormatter: '{value:,.0f}',
4741
},
4842
},
4943
}}
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
import { TrendArea } from '@sensoro-design/chart';
2+
3+
function Example() {
4+
return (
5+
<TrendArea
6+
height={400}
7+
title={{
8+
text: '自定义 Field',
9+
}}
10+
mode="select"
11+
selectTime={[3, 19]}
12+
xField="hour"
13+
yField="val"
14+
data={[
15+
{ hour: 0, val: 5855 },
16+
{ hour: 1, val: 4114 },
17+
{ hour: 2, val: 3687 },
18+
{ hour: 3, val: 3170 },
19+
{ hour: 4, val: 2188 },
20+
{ hour: 5, val: 2376 },
21+
{ hour: 6, val: 9151 },
22+
{ hour: 7, val: 44498 },
23+
{ hour: 8, val: 54363 },
24+
{ hour: 9, val: 56162 },
25+
{ hour: 10, val: 79124 },
26+
{ hour: 11, val: 77276 },
27+
{ hour: 12, val: 96278 },
28+
{ hour: 13, val: 99344 },
29+
{ hour: 14, val: 80707 },
30+
{ hour: 15, val: 82922 },
31+
{ hour: 16, val: 83838 },
32+
{ hour: 17, val: 70549 },
33+
{ hour: 18, val: 65520 },
34+
{ hour: 19, val: 65382 },
35+
{ hour: 20, val: 44962 },
36+
{ hour: 21, val: 29611 },
37+
{ hour: 22, val: 12338 },
38+
{ hour: 23, val: 6522 },
39+
]}
40+
tooltip={{
41+
dimension: {
42+
content: {
43+
key: '出行次数',
44+
value: (datum) => {
45+
return datum?.value;
46+
},
47+
},
48+
},
49+
}}
50+
/>
51+
);
52+
};
53+
54+
export default Example;

docs/custom/demo/TrendArea/reference.tsx

Lines changed: 1 addition & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -5,37 +5,7 @@ function Example() {
55
<TrendArea
66
height={400}
77
selectTime={[3, 19]}
8-
hideReference={false}
9-
referenceSerie={{
10-
data: {
11-
values: [
12-
{ date: 0, value: 9855 },
13-
{ date: 1, value: 7114 },
14-
{ date: 2, value: 5687 },
15-
{ date: 3, value: 5170 },
16-
{ date: 4, value: 4188 },
17-
{ date: 5, value: 4376 },
18-
{ date: 6, value: 17151 },
19-
{ date: 7, value: 84498 },
20-
{ date: 8, value: 104363 },
21-
{ date: 9, value: 106162 },
22-
{ date: 10, value: 139124 },
23-
{ date: 11, value: 147276 },
24-
{ date: 12, value: 176278 },
25-
{ date: 13, value: 179344 },
26-
{ date: 14, value: 150707 },
27-
{ date: 15, value: 152922 },
28-
{ date: 16, value: 163838 },
29-
{ date: 17, value: 140549 },
30-
{ date: 18, value: 115520 },
31-
{ date: 19, value: 125382 },
32-
{ date: 20, value: 84962 },
33-
{ date: 21, value: 49611 },
34-
{ date: 22, value: 22338 },
35-
{ date: 23, value: 12522 },
36-
],
37-
},
38-
}}
8+
showReference
399
data={[
4010
{ date: 0, value: 5855 },
4111
{ date: 1, value: 4114 },
@@ -64,17 +34,11 @@ function Example() {
6434
]}
6535
tooltip={{
6636
dimension: {
67-
title: {
68-
value: (datum) => {
69-
return `${datum?.date}:00 ~ ${datum?.date + 1}:00`;
70-
},
71-
},
7237
content: {
7338
key: '出行次数',
7439
value: (datum) => {
7540
return datum?.value;
7641
},
77-
valueFormatter: '{value:,.0f}',
7842
},
7943
},
8044
}}

docs/custom/demo/TrendArea/select.tsx

Lines changed: 1 addition & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -9,37 +9,7 @@ function Example() {
99
}}
1010
mode="select"
1111
selectTime={[3, 19]}
12-
hideReference={false}
13-
referenceSerie={{
14-
data: {
15-
values: [
16-
{ date: 0, value: 9855 },
17-
{ date: 1, value: 7114 },
18-
{ date: 2, value: 5687 },
19-
{ date: 3, value: 5170 },
20-
{ date: 4, value: 4188 },
21-
{ date: 5, value: 4376 },
22-
{ date: 6, value: 17151 },
23-
{ date: 7, value: 84498 },
24-
{ date: 8, value: 104363 },
25-
{ date: 9, value: 106162 },
26-
{ date: 10, value: 139124 },
27-
{ date: 11, value: 147276 },
28-
{ date: 12, value: 176278 },
29-
{ date: 13, value: 179344 },
30-
{ date: 14, value: 150707 },
31-
{ date: 15, value: 152922 },
32-
{ date: 16, value: 163838 },
33-
{ date: 17, value: 140549 },
34-
{ date: 18, value: 115520 },
35-
{ date: 19, value: 125382 },
36-
{ date: 20, value: 84962 },
37-
{ date: 21, value: 49611 },
38-
{ date: 22, value: 22338 },
39-
{ date: 23, value: 12522 },
40-
],
41-
},
42-
}}
12+
showReference
4313
data={[
4414
{ date: 0, value: 5855 },
4515
{ date: 1, value: 4114 },
@@ -68,17 +38,11 @@ function Example() {
6838
]}
6939
tooltip={{
7040
dimension: {
71-
title: {
72-
value: (datum) => {
73-
return `${datum?.date}:00 ~ ${datum?.date + 1}:00`;
74-
},
75-
},
7641
content: {
7742
key: '出行次数',
7843
value: (datum) => {
7944
return datum?.value;
8045
},
81-
valueFormatter: '{value:,.0f}',
8246
},
8347
},
8448
}}

packages/chart/src/TrendArea/config.ts

Lines changed: 27 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,6 @@
11
import type { CommonChartProps } from '@visactor/react-vchart';
22
import type { IAreaSeriesSpec, ICartesianAxisSpec, IGradient } from './types';
33
import { colorBlue2, colorBlue06, colorGreen2, colorGrey04 } from '@sensoro-design/chart-theme';
4-
import { take } from 'es-toolkit/array';
5-
import { hyphenPointPath } from '../config';
64

75
export const defaultPoint: NonNullable<IAreaSeriesSpec['point']> = {
86
style: {
@@ -17,19 +15,6 @@ export const defaultPoint: NonNullable<IAreaSeriesSpec['point']> = {
1715
},
1816
};
1917

20-
export const defaultTooltip: CommonChartProps['tooltip'] = {
21-
mark: {
22-
visible: false,
23-
},
24-
dimension: {
25-
shapeType: hyphenPointPath,
26-
shapeFill: colorBlue2,
27-
updateContent: (prev) => {
28-
return take(prev!, 1);
29-
},
30-
},
31-
};
32-
3318
export const defaultXAxes: ICartesianAxisSpec = {
3419
orient: 'bottom',
3520
type: 'band',
@@ -124,3 +109,30 @@ export const defaultSelectModeCrosshair: CommonChartProps['crosshair'] = [
124109
followTooltip: true,
125110
},
126111
];
112+
113+
export const defaultReferenceData = [
114+
1,
115+
0,
116+
0,
117+
0,
118+
0,
119+
0,
120+
1,
121+
7,
122+
10,
123+
10,
124+
12,
125+
13,
126+
16,
127+
16,
128+
14,
129+
16,
130+
17,
131+
16,
132+
14,
133+
10,
134+
6,
135+
4,
136+
3,
137+
1,
138+
];

packages/chart/src/TrendArea/index.tsx

Lines changed: 53 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -12,11 +12,17 @@ import {
1212
defaultCrosshair,
1313
defaultPoint,
1414
defaultSelectModeCrosshair,
15-
defaultTooltip,
1615
defaultXAxes,
1716
defaultYAxes,
1817
} from './config';
19-
import { getMarkLineItem, getMarkLineLabel, getMarkPoint, getReferenceSerie } from './utils';
18+
import {
19+
getDefaultTooltip,
20+
getMarkLineItem,
21+
getMarkLineLabel,
22+
getMarkPoint,
23+
getReferenceData,
24+
getReferenceSerie,
25+
} from './utils';
2026

2127
export type {
2228
TrendAreaProps,
@@ -31,7 +37,7 @@ export function TrendArea(props: TrendAreaProps) {
3137
yField = 'value',
3238
xAxes,
3339
yAxes,
34-
hideReference = true,
40+
showReference = false,
3541
referenceSerie,
3642
selectTime,
3743
daytime = defaultDaytime,
@@ -50,14 +56,45 @@ export function TrendArea(props: TrendAreaProps) {
5056
const referenceColor = color.find(item => item.isReference)?.color || colorGrey04;
5157
const xAxesData = merge(defaultXAxes, xAxes);
5258
const yAxesData = merge(defaultYAxes, yAxes);
53-
const referenceSeries = merge(
54-
getReferenceSerie({
59+
const tooltipProps = merge(
60+
getDefaultTooltip({
5561
xField,
5662
yField,
5763
}),
58-
referenceSerie,
64+
tooltip,
65+
);
66+
67+
const referenceSeries = useMemo<IMarkAreaSpec[]>(
68+
() => {
69+
if (!data || !data.length || !showReference) {
70+
return [];
71+
}
72+
73+
const referenceData = getReferenceData({
74+
data,
75+
xField,
76+
yField,
77+
});
78+
79+
if (referenceData.length === 0) {
80+
return [];
81+
}
82+
83+
const defaultReferenceSerie = getReferenceSerie({
84+
xField,
85+
yField,
86+
});
87+
88+
return [
89+
merge(defaultReferenceSerie, referenceSerie, {
90+
data: {
91+
values: referenceData,
92+
},
93+
}),
94+
];
95+
},
96+
[xField, yField, referenceSerie, data, showReference],
5997
);
60-
const tooltipProps = merge({}, defaultTooltip, tooltip);
6198

6299
const { dataList, series, colors } = useMemo(
63100
() => {
@@ -177,11 +214,11 @@ export function TrendArea(props: TrendAreaProps) {
177214
if (isNotNil(selectVal)) {
178215
markLine.push(
179216
getMarkLineItem({
180-
x: selectVal.date,
217+
x: selectVal[xField],
181218
label: firstSelect ? getMarkLineLabel() : undefined,
182219
}),
183220
getMarkLineItem({
184-
x: selectVal.date,
221+
x: selectVal[xField],
185222
line: {
186223
style: {
187224
stroke: colorBlue06,
@@ -192,13 +229,13 @@ export function TrendArea(props: TrendAreaProps) {
192229
}),
193230
);
194231

195-
const isNotNight = selectVal.date >= daytime[0] && selectVal.date <= daytime[1];
232+
const isNotNight = selectVal[xField] >= daytime[0] && selectVal[xField] <= daytime[1];
196233
const notNightColor = color.find(item => item.isNight === false && item.disabled === false)?.color || colorGreen2;
197234

198235
markPoint.push(
199236
getMarkPoint({
200-
x: selectVal.date,
201-
y: selectVal.value,
237+
x: selectVal[xField],
238+
y: selectVal[yField],
202239
itemLine: {
203240
startSymbol: {
204241
visible: true,
@@ -236,7 +273,7 @@ export function TrendArea(props: TrendAreaProps) {
236273
const datum = (data || []).find(item => item[xField] === value);
237274

238275
if (datum) {
239-
if (getSelectVal()?.value === value) {
276+
if (getSelectVal()?.[yField] === value) {
240277
setSelectVal(null);
241278
}
242279
else {
@@ -255,14 +292,15 @@ export function TrendArea(props: TrendAreaProps) {
255292

256293
return (
257294
<CommonChart
258-
color={hideReference ? colors : [referenceColor, ...colors!]}
295+
color={!showReference ? colors : [referenceColor, ...colors!]}
259296
data={dataList}
260-
series={hideReference ? series : [referenceSeries, ...series]}
297+
series={[...referenceSeries, ...series] as IAreaSeriesSpec[]}
261298
axes={[yAxesData, xAxesData]}
262299
crosshair={mode === 'default' ? defaultCrosshair : defaultSelectModeCrosshair}
263300
tooltip={tooltipProps}
264301
markLine={markLine}
265302
markPoint={markPoint}
303+
skipFunctionDiff
266304
onDimensionClick={handleDimensionClick}
267305
markArea={markAreaProps}
268306
{...rest}

packages/chart/src/TrendArea/types.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,10 +20,10 @@ export interface TrendAreaProps extends Omit<CommonChartProps, 'data' | 'xField'
2020
xAxes?: Partial<ICartesianAxisSpec>;
2121
/** 坐标轴 Y 轴配置 */
2222
yAxes?: Partial<ICartesianAxisSpec>;
23-
/** 隐藏参考面积图 */
24-
hideReference?: boolean;
23+
/** 显示参考面积图 */
24+
showReference?: boolean;
2525
/** 参考面积图配置 */
26-
referenceSerie?: Partial<IAreaSeriesSpec>;
26+
referenceSerie?: Partial<Omit<IAreaSeriesSpec, 'data'>>;
2727
/** 白天判断 */
2828
daytime?: [number, number];
2929
/** 选择的时间 */

0 commit comments

Comments
 (0)