@@ -4,126 +4,117 @@ type: 组件
44order : 9
55---
66
7- 饼图标签组件用于在饼图上显示数据标签,支持两种布局方式:默认布局和蜘蛛网布局,提供灵活的标签定位和样式自定义功能 。
7+ 饼图标签组件用于在极坐标下(常见的饼图/环图场景)为扇区显示标签,支持两种布局:默认布局与蜘蛛网布局。文档示例统一采用 Interval + PieLabel 的写法(Interval 用于绘制扇区并映射颜色),以便与测试用例一致 。
88
99## 何时使用
1010
11- - 需要在饼图上显示详细的数据标签
12- - 数据标签需要避免重叠,提供清晰的视觉引导
11+ - 需要在饼图/环图上显示数据标签(两行文本常见:名称 + 值)
12+ - 需要自动避免标签重叠并提供清晰的视觉引导
13+ - 需要响应标签的点击事件
1314
14- ## 使用方式
15+ ## 使用方式(与测试用例保持一致的示例)
16+
17+ 下面示例使用 Interval 绘制扇区(x 字段为固定常量,y 为数值),并通过 color 映射到分类字段 memo,再配合 PieLabel 显示两行标签。
1518
1619``` jsx
17- import { jsx , Canvas , Chart , Pie , PieLabel } from ' @antv/f2' ;
20+ import { jsx , Canvas , Chart , Interval , PieLabel } from ' @antv/f2' ;
1821
1922const context = document .getElementById (' container' ).getContext (' 2d' );
2023const data = [
21- { name: ' 餐饮' , value: 20 },
22- { name: ' 交通' , value: 15 },
23- { name: ' 购物' , value: 25 },
24- { name: ' 娱乐' , value: 30 },
25- { name: ' 其他' , value: 10 },
24+ { amount: 20 , memo: ' Study' , const: ' const' },
25+ { amount: 10 , memo: ' Eat' , const: ' const' },
26+ { amount: 20 , memo: ' Sports' , const: ' const' },
27+ { amount: 10 , memo: ' Other' , const: ' const' },
2628];
2729
2830const { props } = (
29- < Canvas context= {context} pixelRatio= {window .devicePixelRatio }>
30- < Chart data= {data}>
31- < Pie x= " name" y= " value" radius= {0.8 } innerRadius= {0.5 } / >
31+ < Canvas context= {context} animate= {false } pixelRatio= {1 }>
32+ < Chart
33+ data= {data}
34+ coord= {{
35+ type: ' polar' ,
36+ transposed: true ,
37+ innerRadius: 0.3 ,
38+ radius: 0.5 ,
39+ }}
40+ >
41+ < Interval x= " const" y= " amount" adjust= " stack" color= " memo" / >
3242 < PieLabel
33- label1= {(data ) => ({ text: data .name })}
34- label2= {(data ) => ({
35- text: data .value + ' %' ,
36- fontWeight: 500 ,
37- })}
43+ label1= {(d ) => ({ text: d .memo })}
44+ label2= {(d ) => ({ fill: ' #000000' , text: ' $' + d .amount .toFixed (2 ) })}
3845 / >
3946 < / Chart>
4047 < / Canvas>
4148);
4249
43- const chart = new Canvas (props);
44- chart .render ();
50+ const canvas = new Canvas (props);
51+ canvas .render ();
4552```
4653
47- ## 属性
48-
49- ### type: 'default' | 'spider'
50-
51- 标签布局类型,默认为 ` 'default' `
52-
53- - ** default** : 默认布局,使用曲线连接线,标签分布在左右两侧
54- - ** spider** : 蜘蛛网布局,使用直线连接线,标签呈放射状分布,推荐该布局
55-
56- ### anchorOffset: string | number
57-
58- 锚点的偏移量,即标签线与饼图扇形的连接点距离,默认为 ` '10px' `
59-
60- ### inflectionOffset: string | number
61-
62- 拐点的偏移量,即标签线的拐点距离,默认为 ` '30px' `
63-
64- ### sidePadding: string | number
65-
66- 文本距离画布四边的距离,默认为 ` '15px' `
67-
68- ### label1: function
69-
70- 第一行标签配置,接收数据项作为参数,返回标签配置对象
54+ 如果需要响应点击事件:
7155
7256``` jsx
73- label1= {(data ) => ({
74- text: data .name ,
75- fill: ' #808080' ,
76- fontSize: 12 ,
77- textAlign: ' start'
78- })}
57+ < PieLabel
58+ label1= {(d ) => ({ text: d .memo })}
59+ label2= {(d ) => ({ fill: ' #000000' , text: ' $' + d .amount .toFixed (2 ) })}
60+ onClick= {(evt ) => {
61+ // evt.origin 为原始数据项,例如 { amount: 10, memo: 'Eat', const: 'const' }
62+ console .log (' 点击标签,原始数据:' , evt .origin );
63+ }}
64+ / >
7965```
8066
81- ### label2: function
67+ ## 配色参考(Interval 写法)
8268
83- 第二行标签配置,接收数据项作为参数,返回标签配置对象
69+ 可直接在 Interval 上设置 color 映射,也可在使用 Pie 组件时使用相同的 color 配置思路:
8470
8571``` jsx
86- label2= {(data ) => ({
87- text: ' ¥' + data .value .toLocaleString (),
88- fill: ' #000000' ,
89- fontSize: 14 ,
90- fontWeight: 500 ,
91- textAlign: ' start'
92- })}
72+ < Interval
73+ x= " const"
74+ y= " amount"
75+ adjust= " stack"
76+ color= {{
77+ field: ' memo' ,
78+ range: [' #1890FF' , ' #13C2C2' , ' #2FC25B' , ' #FACC14' , ' #F04864' , ' #8543E0' ],
79+ }}
80+ / >
9381```
9482
95- ### records: any [ ]
83+ ## 属性
9684
97- 指定要显示的数据记录,用于自定义显示特定数据项的标签
85+ - type: 'default' | 'spider'
86+ 标签布局类型,默认为 'default'。default 使用曲线连接线并在左右分布;spider 为蜘蛛网式放射布局。
9887
99- ``` jsx
100- records= {[
101- { name: ' 餐饮' , value: 20 },
102- { name: ' 交通' , value: 15 }
103- ]}
104- ```
88+ - anchorOffset: string | number
89+ 标签线锚点偏移,默认 '10px'。
10590
106- ### triggerOn: 'click' | 'press'
91+ - inflectionOffset: string | number
92+ 标签线拐点偏移,默认 '30px'。
10793
108- 触发的事件类型,默认为 ` 'click' `
94+ - sidePadding: string | number
95+ 文本距离画布边缘的最小距离,默认 '15px'。
10996
110- ### onClick: function
97+ - label1: function
98+ 第一行标签配置,接收数据项,返回文本及样式配置。例如:label1={(d) => ({ text: d.memo })}
11199
112- 标签点击事件回调函数,接收事件对象作为参数
100+ - label2: function
101+ 第二行标签配置,接收数据项,返回文本及样式配置。例如:label2={(d) => ({ text: '$' + d.amount.toFixed(2) })}
113102
114- ``` jsx
115- onClick = {( data ) => {
116- console . log ( ' 点击了标签: ' , data);
117- }}
118- ```
103+ - records: any [ ]
104+ 指定只显示的记录数组,可用于筛选需要显示标签的数据项。
105+
106+ - triggerOn: 'click' | 'press'
107+ 触发事件类型,默认 'click'。
119108
120- ### adjustRatio: number
109+ - onClick: function
110+ 标签点击回调,回调参数包含 origin 字段(原始数据项)。
121111
122- 调整高度的阈值比例,默认为 ` 1 `
112+ - adjustRatio: number
113+ 调整布局高度的阈值比例,默认 1。
123114
124115## 标签配置属性
125116
126- 标签配置对象支持以下属性 :
117+ 标签配置对象支持以下字段 :
127118
128119| 属性名 | 类型 | 描述 |
129120| ------------ | ----------------------------- | ---------------- |
@@ -134,127 +125,30 @@ onClick={(data) => {
134125| textAlign | 'start' \| 'center' \| 'end' | 文本对齐方式 |
135126| textBaseline | 'top' \| 'middle' \| 'bottom' | 文本基线对齐方式 |
136127
137- ## 布局类型示例
128+ ## 示例场景(对应测试用例)
138129
139- ### 默认布局
130+ 1 . 默认显示(基本用例)
140131
141- ``` jsx
142- < PieLabel
143- type= " default"
144- label1= {(data ) => ({ text: data .name })}
145- label2= {(data ) => ({ text: data .value + ' %' })}
146- / >
147- ```
148-
149- ### 蜘蛛网布局
150-
151- 蜘蛛网布局适用于数据较多或需要更紧凑布局的场景:
152-
153- ``` jsx
154- < PieLabel
155- type= " spider"
156- anchorOffset= " 15px"
157- inflectionOffset= " 40px"
158- label1= {(data ) => ({
159- text: data .name ,
160- fill: ' #666' ,
161- })}
162- label2= {(data ) => ({
163- text: ' ¥' + data .value .toLocaleString (),
164- fill: ' #000' ,
165- fontWeight: 500 ,
166- })}
167- / >
168- ```
169-
170- ## 使用场景示例
171-
172- ### 基础使用
173-
174- ``` jsx
175- < Chart data= {data}>
176- < Pie x= " name" y= " value" / >
177- < PieLabel label1= {(data ) => ({ text: data .name })} label2= {(data ) => ({ text: data .value })} / >
178- < / Chart>
179- ```
180-
181- ### 自定义样式
182-
183- ``` jsx
184- < Chart data= {data}>
185- < Pie x= " name" y= " value" / >
186- < PieLabel
187- type= " spider"
188- anchorOffset= " 20px"
189- inflectionOffset= " 50px"
190- sidePadding= " 20px"
191- label1= {(data ) => ({
192- text: data .name ,
193- fill: ' #1890ff' ,
194- fontSize: 14 ,
195- fontWeight: 500 ,
196- })}
197- label2= {(data ) => ({
198- text: data .value + ' (' + ((data .value / total) * 100 ).toFixed (1 ) + ' %)' ,
199- fill: ' #666' ,
200- fontSize: 12 ,
201- })}
202- / >
203- < / Chart>
204- ```
132+ - 使用极坐标 coord 配置,Interval 绘制扇区,PieLabel 显示两行标签(名称 + 金额格式化)。
205133
206- ### 交互式标签
134+ 2 . 事件回调对象(onClick)
207135
208- ``` jsx
209- const [selected , setSelected ] = useState (null );
210-
211- < Chart data= {data}>
212- < Pie x= " name" y= " value" / >
213- < PieLabel
214- label1= {(data ) => ({
215- text: data .name ,
216- fill: selected === data .name ? ' #1890ff' : ' #666' ,
217- })}
218- label2= {(data ) => ({
219- text: data .value ,
220- fill: selected === data .name ? ' #1890ff' : ' #000' ,
221- fontWeight: selected === data .name ? 600 : 400 ,
222- })}
223- onClick= {(data ) => setSelected (data .name )}
224- / >
225- < / Chart> ;
226- ```
136+ - 在 PieLabel 中绑定 onClick,回调参数包含 origin(原始数据),可用于业务交互。
227137
228- ### 自定义显示记录
138+ 3 . 多条目布局问题(象限重排)
139+ - 当某一侧(左右)显示标签超过最大数量时,PieLabel 会按优先级将部分象限的标签重新放置到对侧以避免重叠。以下测试场景在文档中简述:
140+ - 左侧超过最大显示个数时,第四象限可能显示在第一象限或第三象限显示在第二象限(基于可用空间与优先级调整)。
141+ - 右侧超过最大显示个数时,第一象限可能显示在第四象限或第二象限显示在第三象限。
229142
230- ``` jsx
231- < Chart data= {allData}>
232- < Pie x= " name" y= " value" / >
233- < PieLabel
234- type= " spider"
235- records= {allData .filter ((d ) => d .value > 10 )} // 只显示值大于10的标签
236- label1= {(data ) => ({ text: data .name })}
237- label2= {(data ) => ({ text: data .value + ' %' })}
238- / >
239- < / Chart>
240- ```
143+ (上述行为请以截图单元测试或实际渲染效果为准,文档中提供的示例与测试用例保持一致以便复现)
241144
242145## 常见问题
243146
244- ### 1. 标签显示不全或重叠
245-
246- - 调整 ` sidePadding ` 属性增加边距
247- - 使用 ` type="spider" ` 蜘蛛网布局获得更好的空间利用
248- - 减少显示的标签数量,使用 ` records ` 属性筛选重要数据
249-
250- ### 2. 标签位置不理想
251-
252- - 调整 ` anchorOffset ` 和 ` inflectionOffset ` 改变连接线长度
253- - 检查数据是否有异常值导致标签位置计算错误
254- - 确保饼图有足够的空间显示标签
147+ - 标签显示不全或重叠:
148+ 调整 sidePadding、anchorOffset、inflectionOffset,或使用 type="spider";也可通过 records 筛选显示的标签。
255149
256- ### 3. 点击事件不响应
150+ - 标签位置不理想:
151+ 检查 coord(极坐标)及 radius/innerRadius 是否给足空间,调整偏移量或布局类型。
257152
258- - 确认 ` triggerOn ` 属性设置正确('click' 或 'press')
259- - 检查是否有其他元素遮挡了标签
260- - 验证 ` onClick ` 回调函数是否正确绑定
153+ - 点击事件不响应:
154+ 检查 triggerOn 是否设置正确,确认没有遮挡元素,并确保回调绑定正确(回调接收事件对象,原始数据在 event.origin 中)。
0 commit comments