Skip to content

Commit b0f2a4b

Browse files
authored
feat(v2/column): support groupField/stackField options (#1377)
1 parent 5daa997 commit b0f2a4b

File tree

4 files changed

+126
-8
lines changed

4 files changed

+126
-8
lines changed

__tests__/unit/plots/column/index-spec.ts

+86
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,49 @@ describe('column', () => {
8080
xField: 'area',
8181
yField: 'sales',
8282
colorField: 'series',
83+
isGroup: true,
84+
});
85+
86+
column.render();
87+
88+
const geometry = column.chart.geometries[0];
89+
expect(geometry.getAdjust('dodge')).toMatchObject({
90+
xField: 'area',
91+
yField: 'sales',
92+
});
93+
expect(geometry.getAdjust('stack')).toBeUndefined();
94+
});
95+
96+
it('grouped column /w groupField', () => {
97+
const column = new Column(createDiv('grouped column /w groupField'), {
98+
width: 400,
99+
height: 300,
100+
data: subSalesByArea,
101+
xField: 'area',
102+
yField: 'sales',
103+
groupField: 'series',
104+
isGroup: true,
105+
});
106+
107+
column.render();
108+
109+
const geometry = column.chart.geometries[0];
110+
expect(geometry.getAdjust('dodge')).toMatchObject({
111+
xField: 'area',
112+
yField: 'sales',
113+
});
114+
expect(geometry.getAdjust('stack')).toBeUndefined();
115+
});
116+
117+
it('grouped column /w seriesField', () => {
118+
const column = new Column(createDiv('grouped column /w seriesField'), {
119+
width: 400,
120+
height: 300,
121+
data: subSalesByArea,
122+
xField: 'area',
123+
yField: 'sales',
124+
seriesField: 'series',
125+
isGroup: true,
83126
});
84127

85128
column.render();
@@ -113,13 +156,56 @@ describe('column', () => {
113156
});
114157
});
115158

159+
it('stacked column /w stackField', () => {
160+
const column = new Column(createDiv('stacked column /w stackField'), {
161+
width: 400,
162+
height: 300,
163+
data: subSalesByArea,
164+
xField: 'area',
165+
yField: 'sales',
166+
stackField: 'series',
167+
isStack: true,
168+
});
169+
170+
column.render();
171+
172+
const geometry = column.chart.geometries[0];
173+
expect(geometry.getAdjust('dodge')).toBeUndefined();
174+
expect(geometry.getAdjust('stack')).toMatchObject({
175+
xField: 'area',
176+
yField: 'sales',
177+
});
178+
});
179+
180+
it('stacked column /w seriesField', () => {
181+
const column = new Column(createDiv('stacked column /w seriesField'), {
182+
width: 400,
183+
height: 300,
184+
data: subSalesByArea,
185+
xField: 'area',
186+
yField: 'sales',
187+
seriesField: 'series',
188+
isStack: true,
189+
});
190+
191+
column.render();
192+
193+
const geometry = column.chart.geometries[0];
194+
expect(geometry.getAdjust('dodge')).toBeUndefined();
195+
expect(geometry.getAdjust('stack')).toMatchObject({
196+
xField: 'area',
197+
yField: 'sales',
198+
});
199+
});
200+
116201
it('grouped column columnWidthRatio/marginRatio', () => {
117202
const column = new Column(createDiv('grouped column columnWidthRatio'), {
118203
width: 400,
119204
height: 300,
120205
data: subSalesByArea,
121206
xField: 'area',
122207
yField: 'sales',
208+
isGroup: true,
123209
colorField: 'series',
124210
columnWidthRatio: 0.7,
125211
marginRatio: 0.1,

__tests__/unit/plots/column/label-spec.ts

+3
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,7 @@ describe('column label', () => {
9696
xField: 'area',
9797
yField: 'sales',
9898
colorField: 'series',
99+
isGroup: true,
99100
meta: {
100101
sales: {
101102
nice: true,
@@ -131,6 +132,7 @@ describe('column label', () => {
131132
xField: 'area',
132133
yField: 'sales',
133134
colorField: 'series',
135+
isGroup: true,
134136
meta: {
135137
sales: {
136138
nice: true,
@@ -166,6 +168,7 @@ describe('column label', () => {
166168
xField: 'area',
167169
yField: 'sales',
168170
colorField: 'series',
171+
isGroup: true,
169172
meta: {
170173
sales: {
171174
nice: true,

src/plots/column/adaptor.ts

+28-7
Original file line numberDiff line numberDiff line change
@@ -6,26 +6,47 @@ import { flow, pick } from '../../utils';
66
import { ColumnOptions } from './types';
77
import { AXIS_META_CONFIG_KEYS } from '../../constant';
88

9+
function getGroupField(params: Params<ColumnOptions>): string {
10+
const { options } = params;
11+
const { groupField, seriesField, colorField } = options;
12+
13+
return groupField || seriesField || colorField;
14+
}
15+
16+
function getStackField(params: Params<ColumnOptions>): string {
17+
const { options } = params;
18+
const { stackField, seriesField, colorField } = options;
19+
20+
return stackField || seriesField || colorField;
21+
}
22+
923
/**
1024
* 字段
1125
* @param params
1226
*/
1327
function field(params: Params<ColumnOptions>): Params<ColumnOptions> {
1428
const { chart, options } = params;
15-
const { data, xField, yField, colorField, color, isStack, marginRatio } = options;
29+
const { data, xField, yField, colorField, color, isGroup, isStack, marginRatio } = options;
1630

1731
chart.data(data);
1832
const geometry = chart.interval().position(`${xField}*${yField}`);
1933

20-
if (colorField) {
21-
geometry.color(colorField, color);
22-
}
23-
24-
if (colorField && ![xField, yField].includes(colorField)) {
34+
if (isGroup) {
35+
geometry.color(getGroupField(params), color);
36+
geometry.adjust({
37+
type: 'dodge',
38+
marginRatio,
39+
});
40+
} else if (isStack) {
41+
geometry.color(getStackField(params), color);
2542
geometry.adjust({
26-
type: isStack ? 'stack' : 'dodge',
43+
type: 'stack',
2744
marginRatio,
2845
});
46+
} else {
47+
if (colorField) {
48+
geometry.color(colorField, color);
49+
}
2950
}
3051

3152
return params;

src/plots/column/types.ts

+9-1
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,16 @@ export interface ColumnOptions extends Options {
88
readonly yField: string;
99
/** 颜色字段,可选 */
1010
readonly colorField?: string;
11-
/** 是否 堆积柱状图, 默认 分组柱状图 */
11+
/** 拆分字段,在分组柱状图下同 groupField、colorField,在堆积柱状图下同 stackField、colorField */
12+
readonly seriesField?: string;
13+
/** 是否分组柱形图 */
14+
readonly isGroup?: boolean;
15+
/** 分组拆分字段 */
16+
readonly groupField?: string;
17+
/** 是否堆积柱状图 */
1218
readonly isStack?: boolean;
19+
/** 堆积拆分字段 */
20+
readonly stackField?: string;
1321
/** 柱状图宽度占比 [0-1] */
1422
readonly columnWidthRatio?: number;
1523
/** 分组中柱子之间的间距 [0-1],仅对分组柱状图适用 */

0 commit comments

Comments
 (0)