diff --git a/common/changes/@visactor/vchart/codex-rose-inner-radius_2026-05-21-09-56.json b/common/changes/@visactor/vchart/codex-rose-inner-radius_2026-05-21-09-56.json new file mode 100644 index 0000000000..5f3f52d08a --- /dev/null +++ b/common/changes/@visactor/vchart/codex-rose-inner-radius_2026-05-21-09-56.json @@ -0,0 +1,11 @@ +{ + "changes": [ + { + "comment": "fix: 修复 roseSeries 在非堆叠场景里 innerRadius 不生效的问题\n\n", + "type": "none", + "packageName": "@visactor/vchart" + } + ], + "packageName": "@visactor/vchart", + "email": "just_star@qq.com" +} \ No newline at end of file diff --git a/packages/vchart/__tests__/unit/series/rose.test.ts b/packages/vchart/__tests__/unit/series/rose.test.ts new file mode 100644 index 0000000000..bf83a9dc23 --- /dev/null +++ b/packages/vchart/__tests__/unit/series/rose.test.ts @@ -0,0 +1,55 @@ +import { DataSet, DataView } from '@visactor/vdataset'; +import { get } from '@visactor/vutils'; +import type { ISeriesOption } from '../../../src/series/interface'; +import { initChartDataSet, seriesOption } from '../../util/context'; +import { RoseSeries, type IRoseSeriesSpec } from '../../../src'; + +const dataSet = new DataSet(); +initChartDataSet(dataSet); + +let ctx: ISeriesOption; + +class TestRoseSeries extends RoseSeries { + protected _computeLayoutRadius() { + return 100; + } +} + +describe('[Domain-Series-Rose] Rose Series', () => { + beforeEach(() => { + ctx = seriesOption({ dataSet }); + }); + + test('non-stacked rose respects innerRadius', () => { + const dataView = new DataView(dataSet); + dataView.parse( + [ + { type: 'A', group: 'g1', value: 10 }, + { type: 'B', group: 'g2', value: 20 } + ], + { + type: 'array' + } + ); + + const rose = new TestRoseSeries( + { + type: 'rose', + data: dataView, + categoryField: ['type', 'group'], + valueField: 'value', + seriesField: 'group', + stack: false, + innerRadius: 0.6 + }, + ctx + ); + rose.created(); + rose.init({}); + + const roseMark = rose.getMarks().find(mark => mark.name === 'rose'); + const innerRadiusStyle = get(roseMark?.stateStyle.normal, 'innerRadius.style'); + + expect(innerRadiusStyle({ value: 10 })).toBe(60); + }); +}); diff --git a/packages/vchart/src/series/rose/rose.ts b/packages/vchart/src/series/rose/rose.ts index 985db90721..5424c6713b 100644 --- a/packages/vchart/src/series/rose/rose.ts +++ b/packages/vchart/src/series/rose/rose.ts @@ -103,15 +103,13 @@ export class RoseSeries extends Ros ), innerRadius: (datum: Datum) => { if (!this.getStack()) { - return 0; + return this._computeLayoutRadius() * this._innerRadius; } const stackStart = valueInScaleRange( this.radiusAxisHelper.dataToPosition([datum[this._innerRadiusField[0]]]), this.radiusAxisHelper.getScale(0) ); - return stackStart <= Number.MIN_VALUE - ? this._computeLayoutRadius() * (this._spec.innerRadius ?? 0) - : stackStart; + return stackStart <= Number.MIN_VALUE ? this._computeLayoutRadius() * this._innerRadius : stackStart; } }); } @@ -141,7 +139,7 @@ export class RoseSeries extends Ros if (this._roseMark) { const animationParams: IRoseAnimationParams = { - innerRadius: () => this._computeLayoutRadius() * (this._spec.innerRadius ?? 0) + innerRadius: () => this._computeLayoutRadius() * this._innerRadius }; this._roseMark.setAnimationConfig( animationConfig(