@@ -13,8 +13,10 @@ import { getColor } from '../../util/color';
13
13
import cloneDeep from '../../util/cloneDeep' ;
14
14
import { handleMinRatio } from './handleOption' ;
15
15
import chartToken from './chartToken' ;
16
+ import merge from '../../util/merge' ;
16
17
17
18
function createSeries ( iChartOption , baseOpt , sum , legendData ) {
19
+ const { showBackground = true } = iChartOption ;
18
20
// 添加series中的数据
19
21
let length = 0 ;
20
22
iChartOption . data . forEach ( dataItem => {
@@ -29,7 +31,7 @@ function createSeries(iChartOption, baseOpt, sum, legendData) {
29
31
type : 'bar' ,
30
32
data : '' ,
31
33
stack : 'a' ,
32
- roundCap : false ,
34
+ roundCap : true ,
33
35
z : 2 ,
34
36
coordinateSystem : 'polar' ,
35
37
} ) ;
@@ -42,12 +44,17 @@ function createSeries(iChartOption, baseOpt, sum, legendData) {
42
44
borderColor : chartToken . itemBorderColor ,
43
45
borderWidth : 2 ,
44
46
} ;
45
- if ( index === 0 ) {
46
- series . z = 1 ;
47
- } else if ( index === baseOpt . series . length - 1 ) {
48
- series . z = 0 ;
49
- } else {
50
- series . roundCap = false ;
47
+ switch ( index ) {
48
+ case 0 :
49
+ series . z = 1 ;
50
+ break ;
51
+ case baseOpt . series . length - 1 :
52
+ series . z = 2 ;
53
+ break ;
54
+ default :
55
+ series . z = 3 ;
56
+ series . roundCap = false ;
57
+ break ;
51
58
}
52
59
} ) ;
53
60
// 将iChartOption的data数据依次赋给series
@@ -58,38 +65,81 @@ function createSeries(iChartOption, baseOpt, sum, legendData) {
58
65
baseOpt . series [ i ] . name = legendData [ i ] ;
59
66
} ) ;
60
67
}
68
+ if ( showBackground ) {
69
+ const placeHolderData = [ ] ;
70
+ iChartOption . data . forEach ( ( _ , index ) => {
71
+ let typeSum = 0 ;
72
+ baseOpt . series . forEach ( ( v ) => {
73
+ typeSum += v . data [ index ] . value ;
74
+ } ) ;
75
+ placeHolderData . push ( {
76
+ type : 'stack背景占位' ,
77
+ value : baseOpt . angleAxis . sum - typeSum ,
78
+ itemStyle : { color : chartToken . itemColor } ,
79
+ sum : 0
80
+ } ) ;
81
+ } ) ;
82
+ baseOpt . series . push ( {
83
+ type : 'bar' ,
84
+ data : placeHolderData ,
85
+ stack : 'a' ,
86
+ roundCap : true ,
87
+ z : 1 ,
88
+ coordinateSystem : 'polar' ,
89
+ silent : true ,
90
+ } ) ;
91
+ }
61
92
}
62
93
63
- const setRadiusAxis = ( baseOpt , data , type ) => {
94
+ const setRadiusAxis = ( baseOpt , data , type , iChartOption ) => {
95
+ const { labelContent = 'name' , showBackground = true } = iChartOption ;
64
96
baseOpt . radiusAxis . z = 10 ;
65
97
baseOpt . radiusAxis . data = [ ] ;
66
98
if ( type === 'process' ) return ; // 进度图不展示左侧文本
67
99
data . forEach ( ( item , index ) => {
68
100
baseOpt . radiusAxis . data . push ( item . name ) ;
69
101
} ) ;
70
-
71
- // if (type === 'base') {
72
- // baseOpt.radiusAxis.axisLabel.rich = {
73
- // value: {
74
- // color: chartToken.labelValueColor,
75
- // padding: [0, chartToken.labelPadding, 0, 0]
76
- // },
77
- // ratio: chartToken.labelRatioColor
78
- // };
79
- // baseOpt.radiusAxis.axisLabel.formatter = (params, index) => {
80
- // let value;
81
- // baseOpt.series[index].data.forEach((dataItem) => {
82
- // if (dataItem.name === params) {
83
- // value = dataItem.beforeChangeValue;
84
- // }
85
- // });
86
- // if (value === undefined) {
87
- // value = data[index].value;
88
- // }
89
- // const ratio = (value / baseOpt.angleAxis.sum * 100).toFixed(2) + '%';
90
- // return `{value|${value}}{ratio|${ratio}}`;
91
- // };
92
- // }
102
+ const getRatio = ( params ) => {
103
+ const index = params [ 1 ] ;
104
+ let value = 0 ;
105
+ let ratio = 0 ;
106
+ if ( iChartOption . type === 'stack' ) {
107
+ if ( ! showBackground ) {
108
+ baseOpt . series . forEach ( val => {
109
+ value += val . data [ index ] . value ;
110
+ } ) ;
111
+ } else {
112
+ baseOpt . series . slice ( 0 , - 1 ) . forEach ( val => {
113
+ value += val . data [ index ] . value ;
114
+ } ) ;
115
+ }
116
+ } else {
117
+ value = baseOpt . series [ index ] . data [ index ] . beforeChangeValue ?? baseOpt . series [ index ] . data [ index ] . value ;
118
+ }
119
+ ratio = value / baseOpt . angleAxis . sum ;
120
+ return ratio ;
121
+ } ;
122
+ const iChartLabelFormatter = iChartOption ?. radiusAxis ?. axisLabel ?. formatter ;
123
+ if ( iChartLabelFormatter ) {
124
+ baseOpt . radiusAxis . axisLabel . formatter = ( ...params ) => iChartLabelFormatter ( ...params , getRatio ( params ) ) ;
125
+ } else {
126
+ if ( labelContent === 'name' ) {
127
+ return ;
128
+ } else if ( labelContent === 'nameWithRatio' ) {
129
+ const iChartLabelRich = iChartOption ?. radiusAxis ?. axisLabel ?. rich ?? { } ;
130
+ const defaultLabelRich = {
131
+ name : {
132
+ color : chartToken . labelValueColor ,
133
+ padding : [ 0 , chartToken . labelPadding , 0 , 0 ]
134
+ } ,
135
+ ratio : {
136
+ color : chartToken . labelRatioColor ,
137
+ }
138
+ } ;
139
+ baseOpt . radiusAxis . axisLabel . rich = merge ( defaultLabelRich , iChartLabelRich ) ;
140
+ baseOpt . radiusAxis . axisLabel . formatter = ( ...params ) => `{name|${ params [ 0 ] } } {ratio|${ ( getRatio ( params ) * 100 ) . toFixed ( 0 ) + '%' } }` ;
141
+ }
142
+ }
93
143
} ;
94
144
95
145
// 配置玉玦图的seriesData数据(value,name,color)
@@ -147,64 +197,62 @@ export function setSeriesData(iChartOption, baseOpt) {
147
197
handleMinRatio ( iChartOption , baseOpt , type ) ;
148
198
149
199
// 配置展示每项data的名称,及显示层级
150
- setRadiusAxis ( baseOpt , data , type ) ;
200
+ setRadiusAxis ( baseOpt , data , type , iChartOption ) ;
151
201
152
202
if ( type === 'process' ) {
153
203
baseOpt . series . forEach ( ( item ) => {
154
204
item . showBackground = showBackground ;
155
205
} ) ;
156
206
} else {
157
- data . forEach ( dataItem => {
158
- let sum = 0 ;
159
- // data中的每项如果没有children
160
- if ( type === 'base' ) {
161
- // 是否显示柱条背景样式---补全75%数据及颜色
162
- if ( showBackground ) {
163
- // 当数据全为0时,手动设置sum和max使其不为0,避免视图丢失
164
- if ( baseOpt . angleAxis . sum === 0 ) {
165
- baseOpt . angleAxis . sum = 1 ;
166
- baseOpt . angleAxis . max = 4 / 3 ;
167
- }
168
- const newData = cloneDeep ( data ) ;
169
- newData . forEach ( newItem => {
170
- newItem . itemStyle = {
171
- color : chartToken . itemColor ,
172
- } ;
173
- newItem . value = baseOpt . angleAxis . sum - newItem . value ;
174
- newItem . sum = 0 ;
175
- } ) ;
176
- baseOpt . series [ data . length ] = {
177
- type : 'bar' ,
178
- data : newData ,
179
- stack : 'a' ,
180
- z : 1 ,
181
- roundCap,
182
- coordinateSystem : 'polar' ,
183
- // 关闭灰色进度鼠标hover事件
184
- silent : true ,
185
- } ;
207
+ let sum = 0 ;
208
+ // data中的每项如果没有children
209
+ if ( type === 'base' ) {
210
+ // 是否显示柱条背景样式---补全75%数据及颜色
211
+ if ( showBackground ) {
212
+ // 当数据全为0时,手动设置sum和max使其不为0,避免视图丢失
213
+ if ( baseOpt . angleAxis . sum === 0 ) {
214
+ baseOpt . angleAxis . sum = 1 ;
215
+ baseOpt . angleAxis . max = 4 / 3 ;
186
216
}
187
- } else {
188
- // data中的value是数组类型,处理数据;配置初始数据及颜色;获取图例type,后续赋给series
189
- let legendData = [ ] ;
190
- data . forEach ( dataItem => {
191
- dataItem . children . forEach ( child => {
192
- sum += child . value ;
193
- } ) ;
194
- } ) ;
195
- data . forEach ( dataItem => {
196
- dataItem . children . forEach ( child => {
197
- child . sum = sum ;
198
- legendData . push ( child . type ) ;
199
- } ) ;
217
+ const newData = cloneDeep ( data ) ;
218
+ newData . forEach ( newItem => {
219
+ newItem . itemStyle = {
220
+ color : chartToken . itemColor ,
221
+ } ;
222
+ newItem . value = baseOpt . angleAxis . sum - newItem . value ;
223
+ newItem . sum = 0 ;
200
224
} ) ;
201
- // 添加series中的数据
202
- legendData = Array . from ( new Set ( legendData ) ) ;
203
- createSeries ( iChartOption , baseOpt , sum , legendData ) ;
204
- // 配置图例颜色
205
- baseOpt . color = color ;
225
+ baseOpt . series [ data . length ] = {
226
+ type : 'bar' ,
227
+ data : newData ,
228
+ stack : 'a' ,
229
+ z : 1 ,
230
+ roundCap,
231
+ coordinateSystem : 'polar' ,
232
+ // 关闭灰色进度鼠标hover事件
233
+ silent : true ,
234
+ } ;
206
235
}
207
- } ) ;
236
+ } else {
237
+ // data中的value是数组类型,处理数据;配置初始数据及颜色;获取图例type,后续赋给series
238
+ let legendData = [ ] ;
239
+ data . forEach ( dataItem => {
240
+ dataItem . children . forEach ( child => {
241
+ sum += child . value ;
242
+ } ) ;
243
+ } ) ;
244
+ data . forEach ( dataItem => {
245
+ dataItem . children . forEach ( child => {
246
+ child . sum = sum ;
247
+ legendData . push ( child . type ) ;
248
+ } ) ;
249
+ } ) ;
250
+ // 添加series中的数据
251
+ legendData = Array . from ( new Set ( legendData ) ) ;
252
+ createSeries ( iChartOption , baseOpt , sum , legendData ) ;
253
+ // 配置图例颜色
254
+ baseOpt . color = color ;
255
+ }
208
256
}
209
257
}
210
258
0 commit comments