Skip to content

Commit b37d67c

Browse files
authored
Merge pull request #19076 from linghaoSu/feat/pie_pad-angle
feat(pie): add padAngle for pie
2 parents fbee94d + 4ce776c commit b37d67c

File tree

3 files changed

+195
-13
lines changed

3 files changed

+195
-13
lines changed

src/chart/pie/PieSeries.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,8 @@ export interface PieSeriesOption extends
113113
clockwise?: boolean
114114
startAngle?: number
115115
endAngle?: number | 'auto'
116+
padAngle?: number;
117+
116118
minAngle?: number
117119
minShowLabelAngle?: number
118120

@@ -219,6 +221,7 @@ class PieSeriesModel extends SeriesModel<PieSeriesOption> {
219221
clockwise: true,
220222
startAngle: 90,
221223
endAngle: 'auto',
224+
padAngle: 0,
222225
// 最小角度改为0
223226
minAngle: 0,
224227

src/chart/pie/pieLayout.ts

Lines changed: 59 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -94,10 +94,14 @@ export default function pieLayout(
9494

9595
let startAngle = -seriesModel.get('startAngle') * RADIAN;
9696
let endAngle = seriesModel.get('endAngle');
97+
const padAngle = seriesModel.get('padAngle') * RADIAN;
98+
9799
endAngle = endAngle === 'auto' ? startAngle - PI2 : -endAngle * RADIAN;
98100

99101
const minAngle = seriesModel.get('minAngle') * RADIAN;
100102

103+
const minAndPadAngle = minAngle + padAngle;
104+
101105
let validDataCount = 0;
102106
data.each(valueDim, function (value: number) {
103107
!isNaN(value) && validDataCount++;
@@ -118,6 +122,7 @@ export default function pieLayout(
118122

119123
const dir = clockwise ? 1 : -1;
120124
const angles = [startAngle, endAngle];
125+
const halfPadAngle = dir * padAngle / 2;
121126
normalizeArcAngles(angles, !clockwise);
122127

123128
[startAngle, endAngle] = angles;
@@ -159,19 +164,34 @@ export default function pieLayout(
159164
angle = angleRange / validDataCount;
160165
}
161166

162-
if (angle < minAngle) {
163-
angle = minAngle;
164-
restAngle -= minAngle;
167+
168+
if (angle < minAndPadAngle) {
169+
angle = minAndPadAngle;
170+
restAngle -= minAndPadAngle;
165171
}
166172
else {
167173
valueSumLargerThanMinAngle += value;
168174
}
169175

170176
const endAngle = currentAngle + dir * angle;
177+
178+
// calculate display angle
179+
let actualStartAngle = 0;
180+
let actualEndAngle = 0;
181+
182+
if (padAngle > angle) {
183+
actualStartAngle = currentAngle + dir * angle / 2;
184+
actualEndAngle = actualStartAngle;
185+
}
186+
else {
187+
actualStartAngle = currentAngle + halfPadAngle;
188+
actualEndAngle = endAngle - halfPadAngle;
189+
}
190+
171191
data.setItemLayout(idx, {
172192
angle: angle,
173-
startAngle: currentAngle,
174-
endAngle: endAngle,
193+
startAngle: actualStartAngle,
194+
endAngle: actualEndAngle,
175195
clockwise: clockwise,
176196
cx: cx,
177197
cy: cy,
@@ -184,19 +204,32 @@ export default function pieLayout(
184204
currentAngle = endAngle;
185205
});
186206

187-
// Some sector is constrained by minAngle
207+
// Some sector is constrained by minAngle and padAngle
188208
// Rest sectors needs recalculate angle
189209
if (restAngle < PI2 && validDataCount) {
190210
// Average the angle if rest angle is not enough after all angles is
191-
// Constrained by minAngle
211+
// Constrained by minAngle and padAngle
192212
if (restAngle <= 1e-3) {
193213
const angle = angleRange / validDataCount;
194214
data.each(valueDim, function (value: number, idx: number) {
195215
if (!isNaN(value)) {
196216
const layout = data.getItemLayout(idx);
197217
layout.angle = angle;
198-
layout.startAngle = startAngle + dir * idx * angle;
199-
layout.endAngle = startAngle + dir * (idx + 1) * angle;
218+
219+
let actualStartAngle = 0;
220+
let actualEndAngle = 0;
221+
222+
if (angle < padAngle) {
223+
actualStartAngle = startAngle + dir * (idx + 1 / 2) * angle;
224+
actualEndAngle = actualStartAngle;
225+
}
226+
else {
227+
actualStartAngle = startAngle + dir * idx * angle + halfPadAngle;
228+
actualEndAngle = startAngle + dir * (idx + 1) * angle - halfPadAngle;
229+
}
230+
231+
layout.startAngle = actualStartAngle;
232+
layout.endAngle = actualEndAngle;
200233
}
201234
});
202235
}
@@ -206,10 +239,23 @@ export default function pieLayout(
206239
data.each(valueDim, function (value: number, idx: number) {
207240
if (!isNaN(value)) {
208241
const layout = data.getItemLayout(idx);
209-
const angle = layout.angle === minAngle
210-
? minAngle : value * unitRadian;
211-
layout.startAngle = currentAngle;
212-
layout.endAngle = currentAngle + dir * angle;
242+
const angle = layout.angle === minAndPadAngle
243+
? minAndPadAngle : value * unitRadian;
244+
245+
let actualStartAngle = 0;
246+
let actualEndAngle = 0;
247+
248+
if (angle < padAngle) {
249+
actualStartAngle = currentAngle + dir * angle / 2;
250+
actualEndAngle = actualStartAngle;
251+
}
252+
else {
253+
actualStartAngle = currentAngle + halfPadAngle;
254+
actualEndAngle = currentAngle + dir * angle - halfPadAngle;
255+
}
256+
257+
layout.startAngle = actualStartAngle;
258+
layout.endAngle = actualEndAngle;
213259
currentAngle += dir * angle;
214260
}
215261
});

test/pie-pad-angle.html

Lines changed: 133 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)