lambo-design-bi 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (39) hide show
  1. package/bi/widget/README.md +18 -0
  2. package/bi/widget/api/data.js +48 -0
  3. package/bi/widget/atom/index.vue +36 -0
  4. package/bi/widget/atom/test.vue +36 -0
  5. package/bi/widget/config/config.js +7 -0
  6. package/bi/widget/container/card/card-widget.vue +46 -0
  7. package/bi/widget/container/card/comps/indicator-card/index.js +7 -0
  8. package/bi/widget/container/card/comps/indicator-card/src/indicator-card-bi-search.vue +132 -0
  9. package/bi/widget/container/card/comps/indicator-card/src/indicator-card-bi.vue +129 -0
  10. package/bi/widget/container/card/comps/indicator-card/src/indicator-card-item-bi.vue +97 -0
  11. package/bi/widget/container/card/comps/indicator-card/src/styles/css/card-search.less +108 -0
  12. package/bi/widget/container/card/comps/indicator-card/src/styles/css/card.less +114 -0
  13. package/bi/widget/layout/col.vue +35 -0
  14. package/bi/widget/layout/row.vue +40 -0
  15. package/bi/widget/num/index.vue +101 -0
  16. package/bi/widget/page/index.vue +38 -0
  17. package/bi/widget/search/search-form.vue +85 -0
  18. package/bi/widget/search/search-item.vue +205 -0
  19. package/bi/widget/table/detail-table.vue +65 -0
  20. package/bi/widget/table/paging-table.vue +188 -0
  21. package/bi/widget/util/widget-map.js +41 -0
  22. package/package.json +39 -0
  23. package/pub/charts/echarts.vue +57 -0
  24. package/pub/charts/factory/charts-factory.vue +58 -0
  25. package/pub/charts/factory/options.js +2351 -0
  26. package/pub/empty/index.vue +33 -0
  27. package/pub/helpbox/README.md +6 -0
  28. package/pub/helpbox/index.vue +363 -0
  29. package/pub/num-index/num-index.vue +120 -0
  30. package/pub/table/detail-table/index.vue +41 -0
  31. package/pub/table/paging-table/README.md +4 -0
  32. package/pub/table/paging-table/comps/export-data.vue +390 -0
  33. package/pub/table/paging-table/comps/export-drawer.vue +429 -0
  34. package/pub/table/paging-table/index.js +3 -0
  35. package/pub/table/paging-table/index.vue +1577 -0
  36. package/pub/table/paging-table/styles/css/index.less +190 -0
  37. package/pub/theme/color.js +3 -0
  38. package/util/math-util.js +71 -0
  39. package/util/num-util.js +16 -0
@@ -0,0 +1,2351 @@
1
+ import * as echarts from 'echarts'
2
+ import {accDiv, accMul} from '../../../util/math-util'
3
+
4
+ function generateTestData(dataX, dataY) {
5
+ const colors = ['#2D8CF0', '#45D5D0', '#FFBF37', '#FD7336', '#655EF3', '#47D791', '#F85968', '#33BFF3', '#C74EF4', '#F84CEE', '#F5D000', '#B7E518'];
6
+ const total = dataY.reduce((a, b) => a + b, 0);
7
+ let result = [];
8
+
9
+ for (let i = 0; i < dataX.length; i++) {
10
+ const name = dataX[i];
11
+ const value = dataY[i];
12
+ let p;
13
+ if (total === 0) {
14
+ p = 0
15
+ } else {
16
+ p = (accMul(accDiv(value, total), 100)).toFixed(1)
17
+ }
18
+ const percentage = p;
19
+ const color = colors[i % colors.length];
20
+
21
+ result.push({
22
+ name: `${name}\n\n${percentage}%`,
23
+ itemStyle: {
24
+ color: color,
25
+ },
26
+ value: percentage,
27
+ });
28
+ }
29
+ return result;
30
+ }
31
+
32
+ function formatTitle(dataDim) {
33
+ let newTitle = '';
34
+ for (let i = 0; i < dataDim.length; i++) {
35
+ if (i > 0 && i % 6 === 0) {
36
+ newTitle += '\n';
37
+ }
38
+ newTitle += dataDim[i];
39
+ }
40
+ return newTitle;
41
+ }
42
+
43
+
44
+ function getLevelOption() {
45
+ return [
46
+ // 原始的配置项数组
47
+ {
48
+ itemStyle: {
49
+ normal: {
50
+ borderWidth: 0,
51
+ gapWidth: 5
52
+ }
53
+ }
54
+ },
55
+ {
56
+ itemStyle: {
57
+ normal: {
58
+ gapWidth: 5
59
+ }
60
+ }
61
+ },
62
+ {
63
+ colorSaturation: [0.3, 0.5],
64
+ itemStyle: {
65
+ normal: {
66
+ gapWidth: 5,
67
+ borderColorSaturation: 0.6
68
+ }
69
+ }
70
+ }
71
+ ];
72
+ }
73
+
74
+ /**
75
+ * type:
76
+ * (charts类型:
77
+ * 10 曲线图
78
+ * 11 折线图
79
+ * 20 单柱状图纵向
80
+ * 21 多柱状图纵向
81
+ * 22 纵向柱状堆叠图
82
+ * 23 单柱状图横向
83
+ * 24 多柱状图横向
84
+ * 25 柱状堆叠图横向
85
+ * 26 无坐标轴无分隔线横向柱状图
86
+ * 30 饼图(弧度代表值大小)
87
+ * 31 饼图(弧度代表值大小,并根据值排序排列)
88
+ * 32 饼图(弧度及半径代表值大小,并根据值排序排列)
89
+ * 33 环形图(弧度代表值大小)
90
+ * 34 环形图(粗细代表值大小)
91
+ * 35 半圆环状图
92
+ * 36 多环图
93
+ * 37 半圆多环图
94
+ * 40 金字塔图
95
+ * 41 矩形树图
96
+ * 42 桑基图
97
+ * 43 仪表盘进度条) <br/>
98
+ * dataX:x轴数据 <br/>
99
+ * dataY:y轴数据 <br/>
100
+ * dataDim:组数据 (例如柱状图、折线图多组数据) <br/>
101
+ * dataZ:z轴数据 (支持立体图)
102
+ * */
103
+ export function getECharts(type, dataX, dataY, dataDim) {
104
+ // TODO 这里的color要引用公共的
105
+ const colors = ['#2D8CF0', '#45D5D0', '#FFBF37', '#FD7336', '#655EF3', '#47D791', '#F85968', '#33BFF3', '#C74EF4', '#F84CEE', '#F5D000', '#B7E518']
106
+ // colors数组对应的areaColors
107
+ const areaColors = colors.map(color => {
108
+ const rgbaStart = hexToRgba(color, 0.2);
109
+ const rgbaEnd = hexToRgba(color, 0.01);
110
+ return new echarts.graphic.LinearGradient(0, 0, 0, 1, [
111
+ { offset: 0, color: rgbaStart },
112
+ { offset: 1, color: rgbaEnd }
113
+ ], false);
114
+ })
115
+ let opt = {}
116
+ if (type === '10' || type === '11') {
117
+ const transposeData = transpose(dataY)
118
+ let series = []
119
+ if (type === '10') {
120
+ for (let i = 0; i < transposeData.length; i++) {
121
+ series.push({
122
+ name: dataDim[i],
123
+ type: 'line',
124
+ smooth: true,
125
+ showAllSymbol: true,
126
+ symbol: 'circle',
127
+ showSymbol: true,
128
+ symbolSize: 5,
129
+ lineStyle: {
130
+ color: colors[i],
131
+ },
132
+ label: { show: false },
133
+ itemStyle: {
134
+ color: colors[i],
135
+ borderColor: hexToRgba(colors[i], 0.6),
136
+ borderWidth: 3
137
+ },
138
+ areaStyle: {
139
+ normal: {
140
+ color: areaColors[i],
141
+ shadowColor: hexToRgba(colors[i], 0.8),
142
+ shadowBlur: 20,
143
+ },
144
+ },
145
+ data: transposeData[i],
146
+ })
147
+ }
148
+ opt = {
149
+ backgroundColor: '#fff',
150
+ legend: {
151
+ icon: 'roundRect',
152
+ itemWidth: 10,
153
+ itemHeight: 6,
154
+ selectedMode: true,
155
+ textStyle: {
156
+ fontSize: '10px',
157
+ fontFamily: 'Microsoft YaHei',
158
+ fontWeight: '400',
159
+ color: '#666'
160
+ }
161
+ },
162
+ tooltip: {
163
+ trigger: 'axis',
164
+ axisPointer: {
165
+ type: 'line',
166
+ lineStyle: {
167
+ color: '#57617B',
168
+ },
169
+ },
170
+ },
171
+ grid: {
172
+ top: '10%',
173
+ left: '2%',
174
+ bottom: '1%',
175
+ containLabel: true
176
+ },
177
+ xAxis: {
178
+ type: 'category',
179
+ axisLine: {
180
+ show: true,
181
+ lineStyle: {
182
+ color: '#EEE',
183
+ },
184
+ },
185
+ axisTick: { show: false },
186
+ axisLabel: {
187
+ fontFamily: 'Microsoft YaHei',
188
+ color: '#666',
189
+ fontSize: 10,
190
+ interval: 0,
191
+ formatter: function (value) {
192
+ let result = '';
193
+ let lineCount = 0;
194
+ for (let i = 0; i < value.length; i += 2) {
195
+ if (lineCount < 2) {
196
+ if (value.length <= 2) {
197
+ result = value
198
+ } else {
199
+ result += value.slice(i, i + 2) + '\n';
200
+ }
201
+ }
202
+ lineCount++;
203
+ }
204
+ return result;
205
+ }
206
+ },
207
+ boundaryGap: false,
208
+ data: dataX,
209
+ },
210
+ yAxis: {
211
+ type: 'value',
212
+ min: 0,
213
+ axisLine: { show: false },
214
+ splitLine: {
215
+ show: true,
216
+ lineStyle: {
217
+ color: '#F6F6F6',
218
+ },
219
+ },
220
+ axisTick: { show: false },
221
+ axisLabel: {
222
+ fontFamily: 'Microsoft YaHei',
223
+ color: '#999',
224
+ fontSize: 10,
225
+ interval: 0,
226
+ formatter: function (value) {
227
+ if (value >= 1000) {
228
+ return value / 1000 + 'k';
229
+ } else {
230
+ return value;
231
+ }
232
+ }
233
+ },
234
+ },
235
+ series: series,
236
+ }
237
+ }
238
+ else if (type === '11') {
239
+ for (let i = 0; i < transposeData.length; i++) {
240
+ series.push({
241
+ name: dataDim[i],
242
+ type: 'line',
243
+ smooth: false,
244
+ showAllSymbol: true,
245
+ symbol: 'none',
246
+ showSymbol: true,
247
+ symbolSize: 5,
248
+ lineStyle: {
249
+ color: colors[i],
250
+ },
251
+ label: { show: false },
252
+ itemStyle: {
253
+ color: colors[i],
254
+ borderColor: hexToRgba(colors[i], 0.6),
255
+ borderWidth: 3
256
+ },
257
+ areaStyle: {
258
+ normal: {
259
+ color: areaColors[i],
260
+ shadowColor: hexToRgba(colors[i], 0.8),
261
+ shadowBlur: 20,
262
+ },
263
+ },
264
+ data: transposeData[i],
265
+ })
266
+ }
267
+ opt = {
268
+ backgroundColor: '#fff',
269
+ legend: {
270
+ icon: 'roundRect',
271
+ itemWidth: 10,
272
+ itemHeight: 6,
273
+ selectedMode: true,
274
+ textStyle: {
275
+ fontSize: '10px',
276
+ fontFamily: 'Microsoft YaHei',
277
+ fontWeight: '400',
278
+ color: '#666'
279
+ }
280
+ },
281
+ tooltip: {
282
+ trigger: 'axis',
283
+ axisPointer: {
284
+ type: 'line',
285
+ lineStyle: {
286
+ color: '#57617B',
287
+ },
288
+ },
289
+ },
290
+ grid: {
291
+ top: '10%',
292
+ left: '2%',
293
+ bottom: '1%',
294
+ containLabel: true
295
+ },
296
+ xAxis: {
297
+ type: 'category',
298
+ axisLine: {
299
+ show: true,
300
+ lineStyle: {
301
+ color: '#EEE',
302
+ },
303
+ },
304
+ axisTick: { show: false },
305
+ axisLabel: {
306
+ fontFamily: 'Microsoft YaHei',
307
+ color: '#666',
308
+ fontSize: 10,
309
+ interval: 0,
310
+ formatter: function (value) {
311
+ let result = '';
312
+ let lineCount = 0;
313
+ for (let i = 0; i < value.length; i += 2) {
314
+ if (lineCount < 2) {
315
+ if (value.length <= 2) {
316
+ result = value
317
+ } else {
318
+ result += value.slice(i, i + 2) + '\n';
319
+ }
320
+ }
321
+ lineCount++;
322
+ }
323
+ return result;
324
+ }
325
+ },
326
+ boundaryGap: false,
327
+ data: dataX,
328
+ },
329
+ yAxis: {
330
+ type: 'value',
331
+ min: 0,
332
+ axisLine: { show: false },
333
+ splitLine: {
334
+ show: true,
335
+ lineStyle: {
336
+ color: '#F6F6F6',
337
+ },
338
+ },
339
+ axisTick: { show: false },
340
+ axisLabel: {
341
+ fontFamily: 'Microsoft YaHei',
342
+ color: '#999',
343
+ fontSize: 10,
344
+ interval: 0,
345
+ formatter: function (value) {
346
+ if (value >= 1000) {
347
+ return value / 1000 + 'k';
348
+ } else {
349
+ return value;
350
+ }
351
+ }
352
+ },
353
+ },
354
+ series: series,
355
+ }
356
+ }
357
+ }
358
+ else if (type === '20' || type === '21' || type === '22' || type === '23' || type === '24' || type === '25' || type === '26') {
359
+ if (type === '20') {
360
+ opt = {
361
+ backgroundColor: '#fff',
362
+ tooltip: {
363
+ trigger: 'axis',
364
+ axisPointer: {
365
+ type: 'shadow'
366
+ }
367
+ },
368
+ grid: {
369
+ top: '10%',
370
+ left: '2%',
371
+ bottom: '1%',
372
+ containLabel: true
373
+ },
374
+ calculable: true,
375
+ xAxis: {
376
+ type: 'category',
377
+ axisLine: {
378
+ show: true,
379
+ lineStyle: {
380
+ color: '#eee',
381
+ },
382
+ },
383
+ axisTick: {
384
+ show: false,
385
+ },
386
+ axisLabel: {
387
+ fontFamily: 'Microsoft YaHei',
388
+ color: '#666',
389
+ fontSize: 10,
390
+ fontWeight: '400',
391
+ interval: 0,
392
+ formatter: function (value) {
393
+ let result = '';
394
+ let lineCount = 0;
395
+ for (let i = 0; i < value.length; i += 2) {
396
+ if (lineCount < 2) {
397
+ if (value.length <= 2) {
398
+ result = value
399
+ } else {
400
+ result += value.slice(i, i + 2) + '\n';
401
+ }
402
+ }
403
+ lineCount++;
404
+ }
405
+ return result;
406
+ }
407
+ },
408
+ data: dataX,
409
+ },
410
+ yAxis: {
411
+ type: 'value',
412
+ axisLine: { show: false },
413
+ splitLine: {
414
+ show: true,
415
+ lineStyle: {
416
+ color: '#f6f6f6',
417
+ },
418
+ },
419
+ axisTick: { show: false },
420
+ axisLabel: {
421
+ fontFamily: 'MicrosoftYaHei',
422
+ color: '#999999',
423
+ fontSize: 10,
424
+ interval: 0,
425
+ formatter: function (value) {
426
+ if (value >= 1000) {
427
+ return value / 1000 + 'k';
428
+ } else {
429
+ return value;
430
+ }
431
+ }
432
+ }
433
+ },
434
+ series: [
435
+ {
436
+ type: 'bar',
437
+ barWidth: '30px',
438
+ itemStyle: {
439
+ normal: {
440
+ color: function (params) {
441
+ let colorArr =
442
+ params.value > 0 ? ['#2d8cf0', 'rgb(150,204,251)'] : ['rgb(150,204,251)', '#2d8cf0'];
443
+ return new echarts.graphic.LinearGradient(
444
+ 0,
445
+ 0,
446
+ 0,
447
+ 1,
448
+ [{
449
+ offset: 0,
450
+ color: colorArr[0],
451
+ },
452
+ {
453
+ offset: 1,
454
+ color: colorArr[1],
455
+ },
456
+ ],
457
+ false
458
+ );
459
+ },
460
+ barBorderRadius: [1],
461
+ },
462
+ },
463
+ label: {
464
+ show: true,
465
+ color: 'rgb(56,159,255)',
466
+ position: 'outside',
467
+ fontSize: 10,
468
+ },
469
+ data: dataY[0],
470
+ },
471
+ ]
472
+ }
473
+ }
474
+ else if (type === '21') {
475
+ let series = []
476
+ const transData = transpose(dataY)
477
+ for (let i = 0; i < transData.length; i++) {
478
+ series.push({
479
+ name: dataDim[i],
480
+ type: 'bar',
481
+ data: transData[i],
482
+ itemStyle: {
483
+ color: colors[i]
484
+ }
485
+ })
486
+ }
487
+ opt = {
488
+ backgroundColor: '#fff',
489
+ tooltip: {
490
+ trigger: 'axis',
491
+ axisPointer: {
492
+ type: 'shadow'
493
+ }
494
+ },
495
+ grid: {
496
+ top: '10%',
497
+ left: '2%',
498
+ bottom: '1%',
499
+ containLabel: true
500
+ },
501
+ legend: {
502
+ icon: 'roundRect',
503
+ itemWidth: 10,
504
+ itemHeight: 6,
505
+ selectedMode: true,
506
+ textStyle: {
507
+ fontSize: '10px',
508
+ fontFamily: 'Microsoft YaHei',
509
+ fontWeight: '400',
510
+ color: '#666'
511
+ }
512
+ },
513
+ xAxis: [{
514
+ type: 'category',
515
+ data: dataX,
516
+ axisLine: {
517
+ lineStyle: {
518
+ color: '#f6f6f6'
519
+ }
520
+ },
521
+ axisLabel: {
522
+ fontFamily: 'Microsoft YaHei',
523
+ color: '#666',
524
+ fontSize: '10px',
525
+ fontWeight: '400',
526
+ interval: 0,
527
+ formatter: function (value) {
528
+ let result = '';
529
+ let lineCount = 0;
530
+ for (let i = 0; i < value.length; i += 2) {
531
+ if (lineCount < 2) {
532
+ if (value.length <= 2) {
533
+ result = value
534
+ } else {
535
+ result += value.slice(i, i + 2) + '\n';
536
+ }
537
+ }
538
+ lineCount++;
539
+ }
540
+ return result;
541
+ }
542
+ },
543
+ axisTick: { show: false }
544
+ }],
545
+ yAxis: [{
546
+ axisLabel: {
547
+ textStyle: {
548
+ fontSize: '10px',
549
+ fontFamily: 'Microsoft YaHei',
550
+ fontWeight: '400',
551
+ color: '#999'
552
+ },
553
+ formatter: function (value) {
554
+ if (value >= 1000) {
555
+ return value / 1000 + 'k';
556
+ } else {
557
+ return value;
558
+ }
559
+ }
560
+ },
561
+ splitLine: {
562
+ lineStyle: {
563
+ color: '#f6f6f6'
564
+ }
565
+ },
566
+ axisLine: { show: false },
567
+ axisTick: { show: false }
568
+ }],
569
+ series: series
570
+ };
571
+ }
572
+ else if (type === '22') {
573
+ let seriesAll = [];
574
+ const transData = transpose(dataY);
575
+ for (let i = 0; i < transData.length; i++) {
576
+ seriesAll.push({
577
+ name: dataDim[i],
578
+ type: 'bar',
579
+ barWidth: '30px',
580
+ stack: 'total',
581
+ color: colors[i],
582
+ label: {
583
+ show: false
584
+ },
585
+ emphasis: {
586
+ focus: 'series'
587
+ },
588
+ data: transData[i]
589
+ });
590
+ }
591
+ opt = {
592
+ backgroundColor: '#fff',
593
+ tooltip: {
594
+ trigger: 'axis',
595
+ axisPointer: {
596
+ type: 'shadow'
597
+ },
598
+ },
599
+ legend: {
600
+ icon: 'roundRect',
601
+ itemWidth: 10,
602
+ itemHeight: 6,
603
+ selectedMode: true,
604
+ textStyle: {
605
+ fontSize: '10px',
606
+ fontFamily: 'Microsoft YaHei',
607
+ fontWeight: '400',
608
+ color: '#666'
609
+ },
610
+ data: dataDim
611
+ },
612
+ grid: {
613
+ top: '10%',
614
+ left: '2%',
615
+ bottom: '1%',
616
+ containLabel: true
617
+ },
618
+ xAxis: {
619
+ type: 'category',
620
+ axisTick: { show: false },
621
+ axisLine: {
622
+ show: true,
623
+ lineStyle: {
624
+ color: '#666666',
625
+ },
626
+ },
627
+ axisLabel: {
628
+ fontSize: '10px',
629
+ fontFamily: 'Microsoft YaHei',
630
+ fontWeight: '400',
631
+ color: '#666666',
632
+ textAlign: 'left',
633
+ interval: 0,
634
+ formatter: function (value) {
635
+ let result = '';
636
+ let lineCount = 0;
637
+ for (let i = 0; i < value.length; i += 2) {
638
+ if (lineCount < 2) {
639
+ if (value.length <= 2) {
640
+ result = value
641
+ } else {
642
+ result += value.slice(i, i + 2) + '\n';
643
+ }
644
+ }
645
+ lineCount++;
646
+ }
647
+ return result;
648
+ }
649
+
650
+ },
651
+ data: dataX
652
+ },
653
+ yAxis: {
654
+ type: 'value',
655
+ position: 'top',
656
+ axisLine: { show: false },
657
+ axisTick: { show: false },
658
+ axisLabel: {
659
+ textStyle: {
660
+ fontSize: '10',
661
+ fontFamily: 'Microsoft YaHei',
662
+ fontWeight: '400',
663
+ color: '#999999',
664
+ },
665
+ interval: 0,
666
+ formatter: function (value) {
667
+ if (value >= 1000) {
668
+ return value / 1000 + 'k';
669
+ } else {
670
+ return value;
671
+ }
672
+ }
673
+ },
674
+ splitLine: {
675
+ lineStyle: {
676
+ color: '#f6f6f6'
677
+ }
678
+ },
679
+ },
680
+ series: seriesAll
681
+ };
682
+ }
683
+ else if (type === '23') {
684
+ let seriesAll = [];
685
+ seriesAll.push({
686
+ type: 'bar',
687
+ barWidth: '10px',
688
+ stack: 'total',
689
+ color: [new echarts.graphic.LinearGradient(0, 0, 1, 0, [{
690
+ offset: 0,
691
+ color: "#7AC1FF"
692
+ }, {
693
+ offset: 1,
694
+ color: colors[0]
695
+ }], false)],
696
+ label: {
697
+ show: false
698
+ },
699
+ emphasis: {
700
+ focus: 'series'
701
+ },
702
+ data: dataX[0]
703
+ });
704
+ opt = {
705
+ backgroundColor: '#fff',
706
+ tooltip: {
707
+ trigger: 'axis',
708
+ axisPointer: {
709
+ type: 'shadow'
710
+ },
711
+ },
712
+ legend: {
713
+ icon: 'roundRect',
714
+ itemWidth: 10,
715
+ itemHeight: 6,
716
+ selectedMode: true,
717
+ textStyle: {
718
+ fontSize: '10px',
719
+ fontFamily: 'Microsoft YaHei',
720
+ fontWeight: '400',
721
+ color: '#666'
722
+ },
723
+ data: dataDim
724
+ },
725
+ grid: {
726
+ top: '10%',
727
+ left: '2%',
728
+ bottom: '1%',
729
+ containLabel: true
730
+ },
731
+ xAxis: {
732
+ type: 'value',
733
+ position: 'top',
734
+ axisLine: { show: false },
735
+ axisTick: { show: false },
736
+ axisLabel: {
737
+ textStyle: {
738
+ fontSize: '10',
739
+ fontFamily: 'Microsoft YaHei',
740
+ fontWeight: '400',
741
+ color: '#999999',
742
+ },
743
+ interval: 0,
744
+ formatter: function (value) {
745
+ if (value >= 1000) {
746
+ return value / 1000 + 'k';
747
+ } else {
748
+ return value;
749
+ }
750
+ }
751
+ },
752
+ splitLine: {
753
+ lineStyle: {
754
+ color: '#f6f6f6'
755
+ }
756
+ },
757
+ },
758
+ yAxis: {
759
+ type: 'category',
760
+ axisTick: { show: false },
761
+ axisLine: {
762
+ show: true,
763
+ lineStyle: {
764
+ color: '#666666',
765
+ },
766
+ },
767
+ axisLabel: {
768
+ fontSize: '10px',
769
+ fontFamily: 'Microsoft YaHei',
770
+ fontWeight: '400',
771
+ color: '#666666',
772
+ textAlign: 'left',
773
+ interval: 0,
774
+ formatter: function (value) {
775
+ let result = '';
776
+ let lineCount = 0;
777
+ for (let i = 0; i < value.length; i += 2) {
778
+ if (lineCount < 2) {
779
+ if (value.length <= 2) {
780
+ result = value
781
+ } else {
782
+ result += value.slice(i, i + 2) + '\n';
783
+ }
784
+ }
785
+ lineCount++;
786
+ }
787
+ return result;
788
+ }
789
+
790
+ },
791
+ data: dataY
792
+ },
793
+ series: seriesAll
794
+ };
795
+ }
796
+ else if (type === '24') {
797
+ let series = []
798
+ const transData = transpose(dataX)
799
+ for (let i = 0; i < transData.length; i++) {
800
+ series.push({
801
+ name: dataDim[i],
802
+ type: 'bar',
803
+ data: transData[i],
804
+ itemStyle: {
805
+ color: colors[i]
806
+ }
807
+ })
808
+ }
809
+ opt = {
810
+ backgroundColor: '#fff',
811
+ tooltip: {
812
+ trigger: 'axis',
813
+ axisPointer: {
814
+ type: 'shadow'
815
+ }
816
+ },
817
+ grid: {
818
+ top: '10%',
819
+ left: '2%',
820
+ bottom: '1%',
821
+ containLabel: true
822
+ },
823
+ legend: {
824
+ icon: 'roundRect',
825
+ itemWidth: 10,
826
+ itemHeight: 6,
827
+ selectedMode: true,
828
+ textStyle: {
829
+ fontSize: '10px',
830
+ fontFamily: 'Microsoft YaHei',
831
+ fontWeight: '400',
832
+ color: '#666'
833
+ }
834
+ },
835
+ xAxis: [{
836
+ axisLabel: {
837
+ textStyle: {
838
+ fontSize: '10px',
839
+ fontFamily: 'Microsoft YaHei',
840
+ fontWeight: '400',
841
+ color: '#999'
842
+ },
843
+ formatter: function (value) {
844
+ if (value >= 1000) {
845
+ return value / 1000 + 'k';
846
+ } else {
847
+ return value;
848
+ }
849
+ }
850
+ },
851
+ splitLine: {
852
+ lineStyle: {
853
+ color: '#f6f6f6'
854
+ }
855
+ },
856
+ axisLine: { show: false },
857
+ axisTick: { show: false }
858
+ }],
859
+ yAxis: [{
860
+ type: 'category',
861
+ data: dataY,
862
+ axisLine: {
863
+ lineStyle: {
864
+ color: '#f6f6f6'
865
+ }
866
+ },
867
+ axisLabel: {
868
+ fontFamily: 'Microsoft YaHei',
869
+ color: '#666',
870
+ fontSize: '10px',
871
+ fontWeight: '400',
872
+ interval: 0,
873
+ formatter: function (value) {
874
+ let result = '';
875
+ let lineCount = 0;
876
+ for (let i = 0; i < value.length; i += 2) {
877
+ if (lineCount < 2) {
878
+ if (value.length <= 2) {
879
+ result = value
880
+ } else {
881
+ result += value.slice(i, i + 2) + '\n';
882
+ }
883
+ }
884
+ lineCount++;
885
+ }
886
+ return result;
887
+ }
888
+ },
889
+ axisTick: { show: false }
890
+ }],
891
+ series: series
892
+ };
893
+ }
894
+ else if (type === '25') {
895
+ let seriesAll = [];
896
+ const transData = transpose(dataX);
897
+ for (let i = 0; i < transData.length; i++) {
898
+ seriesAll.push({
899
+ name: dataDim[i],
900
+ type: 'bar',
901
+ barWidth: '10px',
902
+ stack: 'total',
903
+ color: colors[i],
904
+ label: {
905
+ show: false
906
+ },
907
+ emphasis: {
908
+ focus: 'series'
909
+ },
910
+ data: transData[i]
911
+ });
912
+ }
913
+ opt = {
914
+ backgroundColor: '#fff',
915
+ tooltip: {
916
+ trigger: 'axis',
917
+ axisPointer: {
918
+ type: 'shadow'
919
+ },
920
+ },
921
+ legend: {
922
+ icon: 'roundRect',
923
+ itemWidth: 10,
924
+ itemHeight: 6,
925
+ selectedMode: true,
926
+ textStyle: {
927
+ fontSize: '10px',
928
+ fontFamily: 'Microsoft YaHei',
929
+ fontWeight: '400',
930
+ color: '#666'
931
+ },
932
+ data: dataDim
933
+ },
934
+ grid: {
935
+ top: '10%',
936
+ left: '2%',
937
+ bottom: '1%',
938
+ containLabel: true
939
+ },
940
+ xAxis: {
941
+ type: 'value',
942
+ position: 'top',
943
+ axisLine: { show: false },
944
+ axisTick: { show: false },
945
+ axisLabel: {
946
+ textStyle: {
947
+ fontSize: '10',
948
+ fontFamily: 'Microsoft YaHei',
949
+ fontWeight: '400',
950
+ color: '#999999',
951
+ },
952
+ interval: 0,
953
+ formatter: function (value) {
954
+ if (value >= 1000) {
955
+ return value / 1000 + 'k';
956
+ } else {
957
+ return value;
958
+ }
959
+ }
960
+ },
961
+ splitLine: {
962
+ lineStyle: {
963
+ color: '#f6f6f6'
964
+ }
965
+ },
966
+ },
967
+ yAxis: {
968
+ type: 'category',
969
+ axisTick: { show: false },
970
+ axisLine: {
971
+ show: true,
972
+ lineStyle: {
973
+ color: '#666666',
974
+ },
975
+ },
976
+ axisLabel: {
977
+ fontSize: '10px',
978
+ fontFamily: 'Microsoft YaHei',
979
+ fontWeight: '400',
980
+ color: '#666666',
981
+ textAlign: 'left',
982
+ interval: 0,
983
+ formatter: function (value) {
984
+ let result = '';
985
+ let lineCount = 0;
986
+ for (let i = 0; i < value.length; i += 2) {
987
+ if (lineCount < 2) {
988
+ if (value.length <= 2) {
989
+ result = value
990
+ } else {
991
+ result += value.slice(i, i + 2) + '\n';
992
+ }
993
+ }
994
+ lineCount++;
995
+ }
996
+ return result;
997
+ }
998
+
999
+ },
1000
+ data: dataY
1001
+ },
1002
+ series: seriesAll
1003
+ };
1004
+ }
1005
+ else if (type === '26') {
1006
+ opt = {
1007
+ backgroundColor: '#fff',
1008
+ tooltip: {
1009
+ trigger: 'axis',
1010
+ axisPointer: {
1011
+ type: 'shadow'
1012
+ },
1013
+ },
1014
+ legend: {
1015
+ icon: 'roundRect',
1016
+ itemWidth: 10,
1017
+ itemHeight: 6,
1018
+ selectedMode: true,
1019
+ textStyle: {
1020
+ fontSize: '10px',
1021
+ fontFamily: 'Microsoft YaHei',
1022
+ fontWeight: '400',
1023
+ color: '#666'
1024
+ },
1025
+ data: dataDim
1026
+ },
1027
+ grid: {
1028
+ top: '10%',
1029
+ left: '2%',
1030
+ bottom: '1%',
1031
+ containLabel: true
1032
+ },
1033
+ xAxis: {
1034
+ type: 'value',
1035
+ position: 'top',
1036
+ axisLine: { show: false },
1037
+ axisTick: { show: false },
1038
+ axisLabel: {
1039
+ show: false
1040
+ },
1041
+ splitLine: {
1042
+ show: false
1043
+ }
1044
+ },
1045
+ yAxis: {
1046
+ type: 'category',
1047
+ axisTick: { show: false },
1048
+ axisLine: {
1049
+ show: false,
1050
+ },
1051
+ axisLabel: {
1052
+ fontSize: '10px',
1053
+ fontFamily: 'Microsoft YaHei',
1054
+ fontWeight: '400',
1055
+ color: '#666666',
1056
+ textAlign: 'left',
1057
+ interval: 0,
1058
+ },
1059
+ data: dataY
1060
+ },
1061
+ series: [{
1062
+ type: 'bar',
1063
+ barWidth: '10px',
1064
+ color: [new echarts.graphic.LinearGradient(0, 0, 1, 0, [{
1065
+ offset: 0,
1066
+ color: "#7AC1FF"
1067
+ }, {
1068
+ offset: 1,
1069
+ color: colors[0]
1070
+ }], false)],
1071
+ label: {
1072
+ show: true,
1073
+ position: 'right',
1074
+ fontFamily: 'Microsoft YaHei',
1075
+ fontSize: '12px',
1076
+ formatter: function (params) {
1077
+ return new Intl.NumberFormat().format(params.value);
1078
+ }
1079
+ },
1080
+ emphasis: {
1081
+ focus: 'series'
1082
+ },
1083
+ data: dataX[0]
1084
+ }]
1085
+ };
1086
+ }
1087
+ }
1088
+ else if (type === '30' || type === '31' || type === '32' || type === '33' || type === '34' || type === '35' || type === '36' || type === '37') {
1089
+ if (type === '30') {
1090
+ let newArry = [];
1091
+ for (let i = 0; i < dataY.length; i++) {
1092
+ newArry.push({
1093
+ 'name': dataX[i],
1094
+ 'value': dataY[i],
1095
+ });
1096
+ }
1097
+ opt = {
1098
+ backgroundColor: '#fff',
1099
+ tooltip: {
1100
+ trigger: 'item',
1101
+ formatter: '{b}:<br/> {d}%<br/>{c}'
1102
+ },
1103
+ legend: {
1104
+ icon: 'circle',
1105
+ itemWidth: 8,
1106
+ itemHeight: 8,
1107
+ type: "scroll",
1108
+ orient: 'vertical',
1109
+ top: 'middle',
1110
+ right: '10%',
1111
+ align: 'auto',
1112
+ itemGap: 12,
1113
+ selectedMode: true,
1114
+ formatter: function (name) {
1115
+ let data = newArry;
1116
+ let total = 0;
1117
+ let tarValue;
1118
+ for (let i = 0, l = data.length; i < l; i++) {
1119
+ total += data[i].value;
1120
+ if (data[i].name === name) {
1121
+ tarValue = data[i].value;
1122
+ }
1123
+ }
1124
+ let p;
1125
+ if (total === 0) {
1126
+ p = 0
1127
+ } else {
1128
+ p = (accMul(accDiv(tarValue, total), 100)).toFixed(2)
1129
+ }
1130
+ var showName = name.length > 5 ? name.substr(0, 5) + '...' : name
1131
+ var showValue = tarValue.length > 6 ? tarValue.substr(0, 6) + '...' : tarValue
1132
+ return '{a|' + showName + '}' + '{b|' + p + '%}' + '{c|' + showValue + '}'
1133
+ },
1134
+ textStyle: {
1135
+ rich: {
1136
+ a: {
1137
+ fontSize: 10,
1138
+ color: '#333333',
1139
+ fontFamily: 'Microsoft YaHei',
1140
+ fontWeight: 400,
1141
+ width: 65,
1142
+ },
1143
+ b: {
1144
+ fontSize: 10,
1145
+ color: '#999999',
1146
+ fontFamily: 'Microsoft YaHei',
1147
+ fontWeight: 400,
1148
+ width: 60
1149
+ },
1150
+ c: {
1151
+ fontSize: 13,
1152
+ color: '#333333',
1153
+ fontFamily: "BAHNSCHRIFT",
1154
+ fontWeight: "bold",
1155
+ }
1156
+ }
1157
+ },
1158
+ tooltip: {
1159
+ show: true,
1160
+ trigger: 'item',
1161
+ formatter: function (item) {
1162
+ let data = newArry;
1163
+ let total = 0;
1164
+ let tarValue;
1165
+ for (let i = 0, l = data.length; i < l; i++) {
1166
+ total += data[i].value;
1167
+ if (data[i].name === item.name) {
1168
+ tarValue = data[i].value;
1169
+ }
1170
+ }
1171
+ let p;
1172
+ if (total === 0) {
1173
+ p = 0
1174
+ } else {
1175
+ p = (accMul(accDiv(tarValue, total), 100)).toFixed(2)
1176
+ }
1177
+ return item.name + ':<br/>' + p + '%' + '<br/>' + tarValue
1178
+ },
1179
+ },
1180
+ },
1181
+ color: colors,
1182
+ series: [
1183
+ {
1184
+ type: 'pie',
1185
+ center: ['23%', '50%'],
1186
+ radius: '60%',
1187
+ data: newArry,
1188
+ labelLine: {
1189
+ show: false
1190
+ },
1191
+ label: {
1192
+ show: false,
1193
+ position: 'center'
1194
+ },
1195
+ }
1196
+ ]
1197
+ };
1198
+ }
1199
+ else if (type === '31') {
1200
+ let datas = [];
1201
+ let colorList = [];
1202
+
1203
+ // 将 dataY 转换为带索引的排序数组
1204
+ let sortedIndices = dataY.map((_, index) => index)
1205
+ .sort((a, b) => dataY[b] - dataY[a]); // 根据 dataX 的值降序排列
1206
+
1207
+ for (let i = 0; i < sortedIndices.length; i++) {
1208
+ const index = sortedIndices[i];
1209
+ colorList.push(colors[(i + 1) % colors.length]);
1210
+ datas.push({
1211
+ value: dataY[index],
1212
+ name: dataX[index], // 获取对应的 dataX 值
1213
+ });
1214
+ }
1215
+
1216
+ opt = {
1217
+ backgroundColor: '#fff',
1218
+ color: colorList,
1219
+ legend: {
1220
+ icon: 'circle',
1221
+ itemWidth: 8,
1222
+ itemHeight: 8,
1223
+ type: "scroll",
1224
+ orient: 'horizontal',
1225
+ bottom: "10%",
1226
+ align: 'auto',
1227
+ itemGap: 12,
1228
+ selectedMode: true,
1229
+ formatter: function (name) {
1230
+ if (name !== null && name !== "" && name !== "__other") {
1231
+ let total = 0;
1232
+ let tarValue;
1233
+ for (let i = 0, l = dataX.length; i < l; i++) {
1234
+ total += dataY[i];
1235
+ if (dataX[i] === name) {
1236
+ tarValue = dataY[i];
1237
+ }
1238
+ }
1239
+ let p;
1240
+ if (total === 0) {
1241
+ p = 0
1242
+ } else {
1243
+ p = (accMul(accDiv(tarValue, total), 100)).toFixed(2);
1244
+ }
1245
+ return '{a|' + name + '}' + "\n" + '{b|' + p + '%}'
1246
+ }
1247
+ },
1248
+ textStyle: {
1249
+ rich: {
1250
+ a: {
1251
+ fontSize: 10,
1252
+ color: '#333333',
1253
+ fontFamily: 'Microsoft YaHei',
1254
+ fontWeight: 400,
1255
+ width: 90
1256
+ },
1257
+ b: {
1258
+ fontSize: 13,
1259
+ color: '#333333',
1260
+ fontFamily: "BAHNSCHRIFT",
1261
+ fontWeight: "bold",
1262
+ }
1263
+ }
1264
+ }
1265
+ },
1266
+ series: [{
1267
+ type: 'pie',
1268
+ radius: ['0%', '60%'],
1269
+ avoidLabelOverlap: false,
1270
+ startAngle: 90,
1271
+ center: ['50%', '40%'],
1272
+ itemStyle: {
1273
+ normal: {
1274
+ borderWidth: 0,
1275
+ borderColor: '#FFFFFF',
1276
+ }
1277
+ },
1278
+ data: datas
1279
+ }]
1280
+ };
1281
+ }
1282
+ else if (type === '32') {
1283
+ let total = 0;
1284
+ let datas = [];
1285
+ let colorList = [];
1286
+ let radius = ['40%', '60%']; // 控制饼块粗细的半径范围
1287
+ let prevAngle = 0; // 初始角度
1288
+ let sortedIndices = dataY.map((_, index) => index)
1289
+ .sort((a, b) => dataY[b] - dataY[a]); // 根据dataY的值进行降序排序并获取索引
1290
+
1291
+ for (let i = 0; i < sortedIndices.length; i++) {
1292
+ const index = sortedIndices[i];
1293
+ colorList.push(colors[(i + 1) % colors.length]);
1294
+ total += dataY[index]; // 使用排序后的数据
1295
+ datas.push({
1296
+ value: dataY[index], // 使用排序后的数据
1297
+ name: dataX[index], // 获取对应的dataY值
1298
+ });
1299
+ }
1300
+
1301
+ opt = {
1302
+ backgroundColor: '#fff',
1303
+ color: colorList,
1304
+ graphic: [], // 用于存放Graphic组件配置项
1305
+
1306
+ legend: {
1307
+ icon: 'circle',
1308
+ itemWidth: 8,
1309
+ itemHeight: 8,
1310
+ type: "scroll",
1311
+ orient: 'horizontal',
1312
+ bottom: "10%",
1313
+ align: 'auto',
1314
+ itemGap: 12,
1315
+ selectedMode: true,
1316
+ formatter: function (name) {
1317
+ if (name !== null && name !== "" && name !== "__other") {
1318
+ let total = 0;
1319
+ let tarValue;
1320
+ for (let i = 0, l = dataX.length; i < l; i++) {
1321
+ total += dataY[i];
1322
+ if (dataX[i] === name) {
1323
+ tarValue = dataY[i];
1324
+ }
1325
+ }
1326
+ let p;
1327
+ if (total === 0) {
1328
+ p = 0
1329
+ } else {
1330
+ p = (accMul(accDiv(tarValue, total), 100)).toFixed(2);
1331
+ }
1332
+ return '{a|' + name + '}' + "\n" + '{b|' + p + '%}'
1333
+ }
1334
+ },
1335
+ textStyle: {
1336
+ rich: {
1337
+ a: {
1338
+ fontSize: 10,
1339
+ color: '#333333',
1340
+ fontFamily: 'Microsoft YaHei',
1341
+ fontWeight: 400,
1342
+ width: 90
1343
+ },
1344
+ b: {
1345
+ fontSize: 13,
1346
+ color: '#333333',
1347
+ fontFamily: "BAHNSCHRIFT",
1348
+ fontWeight: "bold",
1349
+ }
1350
+ }
1351
+ }
1352
+ },
1353
+ series: [{
1354
+ type: 'pie',
1355
+ radius: ['0%', '60%'],
1356
+ roseType: 'radius',
1357
+ avoidLabelOverlap: false,
1358
+ startAngle: 90,
1359
+ center: ['50%', '40%'],
1360
+ itemStyle: {
1361
+ normal: {
1362
+ borderWidth: 0,
1363
+ borderColor: '#FFFFFF',
1364
+ }
1365
+ },
1366
+ data: datas
1367
+ }]
1368
+ };
1369
+
1370
+ // 动态生成Graphic组件配置项
1371
+ for (let i = 0; i < datas.length; i++) {
1372
+ let startAngle = prevAngle;
1373
+ let endAngle = startAngle + (datas[i].value / total) * 2 * Math.PI;
1374
+ opt.graphic.push({
1375
+ type: 'sector',
1376
+ shape: {
1377
+ cx: '50%', // 饼图中心位置 x 坐标
1378
+ cy: '40%', // 饼图中心位置 y 坐标
1379
+ r: radius, // 饼块半径
1380
+ startAngle: startAngle,
1381
+ endAngle: endAngle
1382
+ },
1383
+ style: {
1384
+ fill: colors[(i + 1) % colors.length]
1385
+ }
1386
+ });
1387
+ prevAngle = endAngle;
1388
+ }
1389
+ }
1390
+ else if (type === '33') {
1391
+ let data = []
1392
+ let sum = 0
1393
+ for (let i = 0; i < dataY.length; i++) {
1394
+ data.push({
1395
+ name: dataX[i],
1396
+ value: dataY[i]
1397
+ })
1398
+ sum += dataY[i]
1399
+ }
1400
+
1401
+ opt = {
1402
+ backgroundColor: '#fff',
1403
+ title: {
1404
+ text: formatTitle(dataDim[0]),
1405
+ textAlign: 'center',
1406
+ textStyle: {
1407
+ fontSize: '10px',
1408
+ fontFamily: 'Microsoft YaHei',
1409
+ fontWeight: '400',
1410
+ color: '#999',
1411
+ textAlign: 'center'
1412
+ },
1413
+ left: '25%',
1414
+ top: 'center',
1415
+ },
1416
+ tooltip: {
1417
+ trigger: 'item',
1418
+ borderWidth: 1,
1419
+ padding: 5,
1420
+ formatter: '{b}: <br/>{d}%<br/>{c}'
1421
+ },
1422
+ legend: {
1423
+ icon: 'circle',
1424
+ itemWidth: 8,
1425
+ itemHeight: 8,
1426
+ type: "scroll",
1427
+ orient: 'vertical',
1428
+ top: 'middle',
1429
+ right: '10%',
1430
+ align: 'auto',
1431
+ itemGap: 12,
1432
+ selectedMode: true,
1433
+ formatter: function (name) {
1434
+ for (let i = 0; i < dataX.length; i++) {
1435
+ let p;
1436
+ if (sum === 0) {
1437
+ p = 0
1438
+ } else {
1439
+ p = (accMul(accDiv(dataY[i], sum), 100)).toFixed(2)
1440
+ }
1441
+ if (dataX[i] === name) {
1442
+ var tarValue = dataY[i]
1443
+ var showName = name.length > 5 ? name.substr(0, 5) + '...' : name
1444
+ var showValue = tarValue.length > 6 ? tarValue.substr(0, 6) + '...' : tarValue
1445
+ return '{a|' + showName + '}' + '{b|' + p + '%}' + '{c|' + showValue + '}'
1446
+ }
1447
+ }
1448
+ },
1449
+ textStyle: {
1450
+ rich: {
1451
+ a: {
1452
+ fontSize: 10,
1453
+ color: '#333333',
1454
+ fontFamily: 'Microsoft YaHei',
1455
+ fontWeight: 400,
1456
+ width: 65,
1457
+ },
1458
+ b: {
1459
+ fontSize: 10,
1460
+ color: '#999999',
1461
+ fontFamily: 'Microsoft YaHei',
1462
+ fontWeight: 400,
1463
+ width: 60
1464
+ },
1465
+ c: {
1466
+ fontSize: 13,
1467
+ color: '#333333',
1468
+ fontFamily: "BAHNSCHRIFT",
1469
+ fontWeight: "bold",
1470
+ }
1471
+ }
1472
+ },
1473
+ tooltip: {
1474
+ show: true,
1475
+ trigger: 'item',
1476
+ formatter: function (item) {
1477
+ for (let i = 0; i < dataX.length; i++) {
1478
+ let p;
1479
+ if (sum === 0) {
1480
+ p = 0
1481
+ } else {
1482
+ p = (accMul(accDiv(dataY[i], sum), 100)).toFixed(2)
1483
+ }
1484
+ if (dataX[i] === item.name) {
1485
+ return item.name + ':<br/>' + p + '%' + '<br/>' + dataY[i]
1486
+ }
1487
+ }
1488
+ },
1489
+ }
1490
+ },
1491
+ series: [{
1492
+ type: 'pie',
1493
+ z: 3,
1494
+ center: ['25%', '50%'],
1495
+ radius: ['60', '75'],
1496
+ clockwise: true,
1497
+ avoidLabelOverlap: true,
1498
+ hoverOffset: 15,
1499
+ itemStyle: {
1500
+ normal: {
1501
+ color: function (params) {
1502
+ return colors[params.dataIndex]
1503
+ }
1504
+ }
1505
+ },
1506
+ label: {
1507
+ show: false
1508
+ },
1509
+ data: data
1510
+ }]
1511
+ }
1512
+ }
1513
+ else if (type === '34') {
1514
+ let newArry = [];
1515
+ for (let i = 0; i < dataY.length; i++) {
1516
+ newArry.push({
1517
+ 'name': dataX[i],
1518
+ 'value': dataY[i],
1519
+ });
1520
+ }
1521
+ opt = {
1522
+ backgroundColor: '#fff',
1523
+ title: {
1524
+ text: formatTitle(dataDim[0]),
1525
+ textAlign: 'center',
1526
+ textStyle: {
1527
+ fontSize: '10px',
1528
+ fontFamily: 'Microsoft YaHei',
1529
+ fontWeight: '400',
1530
+ color: '#999',
1531
+ textAlign: 'center'
1532
+ },
1533
+ left: '23%',
1534
+ top: 'center',
1535
+ },
1536
+ tooltip: {
1537
+ trigger: 'item',
1538
+ formatter: '{b}:<br/> {d}%<br/>{c}'
1539
+ },
1540
+ legend: {
1541
+ icon: 'circle',
1542
+ itemWidth: 8,
1543
+ itemHeight: 8,
1544
+ type: "scroll",
1545
+ orient: 'vertical',
1546
+ top: 'middle',
1547
+ right: '10%',
1548
+ align: 'auto',
1549
+ itemGap: 12,
1550
+ selectedMode: true,
1551
+ formatter: function (name) {
1552
+ let data = newArry;
1553
+ let total = 0;
1554
+ let tarValue;
1555
+ for (let i = 0, l = data.length; i < l; i++) {
1556
+ total += data[i].value;
1557
+ if (data[i].name === name) {
1558
+ tarValue = data[i].value;
1559
+ }
1560
+ }
1561
+ let p;
1562
+ if (total === 0) {
1563
+ p = 0
1564
+ } else {
1565
+ p = (accMul(accDiv(tarValue, total), 100)).toFixed(2)
1566
+ }
1567
+ var showName = name.length > 5 ? name.substr(0, 5) + '...' : name
1568
+ var showValue = tarValue.length > 6 ? tarValue.substr(0, 6) + '...' : tarValue
1569
+ return '{a|' + showName + '}' + '{b|' + p + '%}' + '{c|' + showValue + '}'
1570
+ },
1571
+ textStyle: {
1572
+ rich: {
1573
+ a: {
1574
+ fontSize: 10,
1575
+ color: '#333333',
1576
+ fontFamily: 'Microsoft YaHei',
1577
+ fontWeight: 400,
1578
+ width: 65,
1579
+ },
1580
+ b: {
1581
+ fontSize: 10,
1582
+ color: '#999999',
1583
+ fontFamily: 'Microsoft YaHei',
1584
+ fontWeight: 400,
1585
+ width: 60
1586
+ },
1587
+ c: {
1588
+ fontSize: 13,
1589
+ color: '#333333',
1590
+ fontFamily: "BAHNSCHRIFT",
1591
+ fontWeight: "bold",
1592
+ }
1593
+ }
1594
+ },
1595
+ tooltip: {
1596
+ show: true,
1597
+ trigger: 'item',
1598
+ formatter: function (item) {
1599
+ let data = newArry;
1600
+ let total = 0;
1601
+ let tarValue;
1602
+ for (let i = 0, l = data.length; i < l; i++) {
1603
+ total += data[i].value;
1604
+ if (data[i].name === item.name) {
1605
+ tarValue = data[i].value;
1606
+ }
1607
+ }
1608
+ let p;
1609
+ if (total === 0) {
1610
+ p = 0
1611
+ } else {
1612
+ p = (accMul(accDiv(tarValue, total), 100)).toFixed(2)
1613
+ }
1614
+ return item.name + ':<br/>' + p + '%' + '<br/>' + tarValue
1615
+ },
1616
+ },
1617
+ },
1618
+ color: colors,
1619
+ series: [{
1620
+ type: 'pie',
1621
+ roseType: 'area',
1622
+ center: ['23%', '50%'],
1623
+ radius: ['75', '95'],
1624
+ clockwise: true,
1625
+ avoidLabelOverlap: true,
1626
+ label: {
1627
+ show: false,
1628
+ position: 'center'
1629
+ },
1630
+ emphasis: {
1631
+ label: {
1632
+ show: false,
1633
+ }
1634
+ },
1635
+ labelLine: {
1636
+ show: false
1637
+ },
1638
+ data: newArry
1639
+ }]
1640
+ }
1641
+ }
1642
+ else if (type === '35') {
1643
+ let total = 0;
1644
+ let datas = [];
1645
+ let colorList = [];
1646
+ for (let i = 0; i < dataY.length; i++) {
1647
+ colorList.push(colors[(i + 1) % colors.length]);
1648
+ total += dataY[i];
1649
+ var showName = dataX[i].length > 5 ? dataX[i].substr(0, 5) + '...' : dataX[i]
1650
+ datas.push({
1651
+ value: dataY[i],
1652
+ name: showName,
1653
+ })
1654
+ }
1655
+ colorList.push('transparent');
1656
+ datas.push({
1657
+ value: total,
1658
+ name: "__other",
1659
+ label: { show: false },
1660
+ labelLine: { show: false },
1661
+ itemStyle: {
1662
+ normal: {
1663
+ borderWidth: 0,
1664
+ shadowBlur: 0,
1665
+ borderColor: 'transparent',
1666
+ shadowColor: 'transparent'
1667
+ }
1668
+ },
1669
+ })
1670
+ opt = {
1671
+ backgroundColor: '#fff',
1672
+ color: colorList,
1673
+ legend: {
1674
+ icon: 'circle',
1675
+ itemWidth: 8,
1676
+ itemHeight: 8,
1677
+ type: "scroll",
1678
+ orient: 'horizontal',
1679
+ bottom: "10%",
1680
+ align: 'auto',
1681
+ itemGap: 12,
1682
+ selectedMode: true,
1683
+ formatter: function (name) {
1684
+ if (name !== null && name !== "" && name !== "__other") {
1685
+ let total = 0;
1686
+ let tarValue;
1687
+ for (let i = 0, l = dataY.length; i < l; i++) {
1688
+ total += dataY[i];
1689
+ var showName = dataX[i].length > 5 ? dataX[i].substr(0, 5) + '...' : dataX[i]
1690
+
1691
+ if (showName === name) {
1692
+ tarValue = dataY[i];
1693
+ }
1694
+ }
1695
+ let p;
1696
+ if (total === 0) {
1697
+ p = 0
1698
+ } else {
1699
+ p = (accMul(accDiv(tarValue, total), 100)).toFixed(2);
1700
+ }
1701
+ return '{a|' + name + '}' + "\n" + '{b|' + p + '%}'
1702
+ }
1703
+ },
1704
+ textStyle: {
1705
+ rich: {
1706
+ a: {
1707
+ fontSize: 10,
1708
+ color: '#333333',
1709
+ fontFamily: 'Microsoft YaHei',
1710
+ fontWeight: 400,
1711
+ width: 90
1712
+ },
1713
+ b: {
1714
+ fontSize: 13,
1715
+ color: '#333333',
1716
+ fontFamily: "BAHNSCHRIFT",
1717
+ fontWeight: "bold",
1718
+ }
1719
+ }
1720
+ }
1721
+ },
1722
+ series: [{
1723
+ type: 'pie',
1724
+ radius: ['40%', '70%'],
1725
+ avoidLabelOverlap: false,
1726
+ startAngle: 180,
1727
+ center: ['50%', '50%'],
1728
+ itemStyle: {
1729
+ normal: {
1730
+ borderWidth: 0,
1731
+ borderColor: '#FFFFFF',
1732
+ }
1733
+ },
1734
+ data: datas
1735
+ }]
1736
+ }
1737
+ }
1738
+ else if (type === '36') {
1739
+ let sum = dataY.reduce((a, b) => a + b);
1740
+ let pieSeries = [];
1741
+ let showBackground = false;//是否显示圆环条形背景,true显示,false不显示
1742
+ let barOut = 65, barIn = 62, barBroad = 4;//控制圆环条宽度 barOut - barIn = 圆环条宽度,barBroad - 圆环条宽度 = 圆环条间距
1743
+ if (dataY.length <= 7) {//根据数据量选择合适的宽度,7条及以下数据将放宽圆环条
1744
+ barOut = 65;
1745
+ barIn = 58;
1746
+ barBroad = 8;
1747
+ } else if (dataY.length >= 14) {
1748
+ barOut = 65;
1749
+ barIn = 63;
1750
+ barBroad = 3;
1751
+ }
1752
+ dataX.map((name, index) => {
1753
+ pieSeries.push({
1754
+ left: 20,
1755
+ name: name,
1756
+ type: 'pie',
1757
+ clockWise: false,
1758
+ hoverAnimation: false,
1759
+ radius: [barOut - index * barBroad + '%', barIn - index * barBroad + '%'],
1760
+ center: ["30%", "50%"],
1761
+ label: {
1762
+ show: false
1763
+ },
1764
+ data: [{
1765
+ value: dataY[index] * dataX.length,
1766
+ name: name
1767
+ },
1768
+ {
1769
+ value: sum - dataY[index],
1770
+ name: name,
1771
+ itemStyle: {
1772
+ normal: {
1773
+ color: "rgba(0,0,0,0)"
1774
+ }
1775
+ },
1776
+ label: {
1777
+ normal: {
1778
+ show: false,
1779
+ },
1780
+ emphasis: {
1781
+ show: false
1782
+ }
1783
+ },
1784
+ labelLine: {
1785
+ normal: {
1786
+ show: false
1787
+ },
1788
+ emphasis: {
1789
+ show: false
1790
+ }
1791
+ },
1792
+ tooltip: {
1793
+ show: false,
1794
+ formatter: function () {
1795
+ return '';
1796
+ }
1797
+ }
1798
+ }
1799
+ ]
1800
+ });
1801
+ if (showBackground === true) {
1802
+ pieSeries.push({
1803
+ left: 10,
1804
+ name: '',
1805
+ type: 'pie',
1806
+ silent: true,
1807
+ z: 1,
1808
+ clockWise: false, //顺时加载
1809
+ hoverAnimation: false, //鼠标移入变大
1810
+ radius: [barOut - index * barBroad + '%', barIn - index * barBroad + '%'],
1811
+ center: ["30%", "50%"],
1812
+ label: {
1813
+ show: false
1814
+ },
1815
+ data: [{
1816
+ value: 5,
1817
+ itemStyle: {
1818
+ color: "#E3F0FF"
1819
+ }
1820
+ },
1821
+ ]
1822
+ });
1823
+ }
1824
+ })
1825
+
1826
+ opt = {
1827
+ backgroundColor: '#fff',
1828
+ color: colors,
1829
+ grid: {
1830
+ top: '15%',
1831
+ bottom: '54%',
1832
+ left: "30%",
1833
+ containLabel: false
1834
+ },
1835
+ legend: {
1836
+ icon: 'circle',
1837
+ itemWidth: 8,
1838
+ itemHeight: 8,
1839
+ type: "scroll",
1840
+ orient: 'vertical',
1841
+ top: 'middle',
1842
+ right: '10%',
1843
+ align: 'auto',
1844
+ itemGap: 12,
1845
+ selectedMode: false,
1846
+ formatter: function (name) {
1847
+ let total = 0;
1848
+ let tarValue;
1849
+ for (let i = 0, l = dataY.length; i < l; i++) {
1850
+ total += dataY[i];
1851
+ if (dataX[i] === name) {
1852
+ tarValue = dataY[i];
1853
+ }
1854
+ }
1855
+ let p;
1856
+ if (total === 0) {
1857
+ p = 0
1858
+ } else {
1859
+ p = (accMul(accDiv(tarValue, total), 100)).toFixed(2);
1860
+ }
1861
+ var showName = name.length > 5 ? name.substr(0, 5) + '...' : name
1862
+ return '{a|' + showName + '}' + '{b|' + p + '%}'
1863
+ },
1864
+ textStyle: {
1865
+ rich: {
1866
+ a: {
1867
+ fontSize: 10,
1868
+ color: '#333333',
1869
+ fontFamily: 'Microsoft YaHei',
1870
+ fontWeight: 400,
1871
+ width: 90
1872
+ },
1873
+ b: {
1874
+ fontSize: 13,
1875
+ color: '#333333',
1876
+ fontFamily: "BAHNSCHRIFT",
1877
+ fontWeight: "bold",
1878
+ }
1879
+ }
1880
+ }
1881
+ },
1882
+ series: pieSeries
1883
+ };
1884
+ }
1885
+ else if (type === '37') {
1886
+ let sum = dataY.reduce((a, b) => a + b);
1887
+ let pieSeries = [];
1888
+ let showBackground = true;//是否显示圆环条形背景,true显示,false不显示
1889
+ let barOut = 85, barIn = 82, barBroad = 4;//控制圆环条宽度 barOut - barIn = 圆环条宽度,barBroad - 圆环条宽度 = 圆环条间距
1890
+ if (dataY.length <= 7) {//根据数据量选择合适的宽度,7条及以下数据将放宽圆环条
1891
+ barOut = 85;
1892
+ barIn = 78;
1893
+ barBroad = 8;
1894
+ } else if (dataY.length >= 14) {
1895
+ barOut = 85;
1896
+ barIn = 83;
1897
+ barBroad = 3;
1898
+ }
1899
+ dataX.map((name, index) => {
1900
+ pieSeries.push({
1901
+ left: "25%",
1902
+ name: name,
1903
+ type: 'pie',
1904
+ clockWise: true,//顺时针?
1905
+ startAngle: 180,
1906
+ hoverAnimation: false,
1907
+ radius: [barOut - index * barBroad + '%', barIn - index * barBroad + '%'],
1908
+ center: ["30%", "50%"],
1909
+ label: {
1910
+ show: false
1911
+ },
1912
+ data: [{
1913
+ value: dataY[index],
1914
+ name: name
1915
+ },
1916
+ {
1917
+ value: sum,
1918
+ name: name,
1919
+ itemStyle: {
1920
+ normal: {
1921
+ color: "rgba(0,0,0,0)"
1922
+ }
1923
+ },
1924
+ label: {
1925
+ normal: {
1926
+ show: false,
1927
+ },
1928
+ emphasis: {
1929
+ show: false
1930
+ }
1931
+ },
1932
+ labelLine: {
1933
+ normal: {
1934
+ show: false
1935
+ },
1936
+ emphasis: {
1937
+ show: false
1938
+ }
1939
+ },
1940
+ tooltip: {
1941
+ show: false,
1942
+ formatter: function () {
1943
+ return '';
1944
+ }
1945
+ }
1946
+ }
1947
+ ]
1948
+ });
1949
+ if (showBackground == true) {
1950
+ pieSeries.push({
1951
+ left: "25%",
1952
+ name: name,
1953
+ type: 'pie',
1954
+ silent: true,
1955
+ z: 1,
1956
+ clockWise: true, //顺时加载
1957
+ startAngle: 180,
1958
+ hoverAnimation: false, //鼠标移入变大
1959
+ radius: [barOut - index * barBroad + '%', barIn - index * barBroad + '%'],
1960
+ center: ["30%", "50%"],
1961
+ label: {
1962
+ show: false
1963
+ },
1964
+ data: [{
1965
+ value: 5,
1966
+ name: name,
1967
+ itemStyle: {
1968
+ color: "#E3F0FF"
1969
+ },
1970
+ },
1971
+ {
1972
+ value: 5,
1973
+ name: name,
1974
+ itemStyle: {
1975
+ normal: {
1976
+ color: "rgba(0,0,0,0)"
1977
+ }
1978
+ },
1979
+ label: {
1980
+ normal: {
1981
+ show: false,
1982
+ },
1983
+ emphasis: {
1984
+ show: false
1985
+ }
1986
+ },
1987
+ labelLine: {
1988
+ normal: {
1989
+ show: false
1990
+ },
1991
+ emphasis: {
1992
+ show: false
1993
+ }
1994
+ },
1995
+ tooltip: {
1996
+ show: false,
1997
+ formatter: function () {
1998
+ return '';
1999
+ }
2000
+ }
2001
+ }
2002
+ ]
2003
+ });
2004
+ }
2005
+ })
2006
+
2007
+ opt = {
2008
+ backgroundColor: '#fff',
2009
+ color: colors,
2010
+ grid: {
2011
+ top: '15%',
2012
+ bottom: '54%',
2013
+ left: "30%",
2014
+ containLabel: false
2015
+ },
2016
+ legend: {
2017
+ icon: 'circle',
2018
+ itemWidth: 8,
2019
+ itemHeight: 8,
2020
+ type: "scroll",
2021
+ orient: 'horizontal',
2022
+ bottom: "10%",
2023
+ align: 'auto',
2024
+ itemGap: 12,
2025
+ selectedMode: false,
2026
+ formatter: function (name) {
2027
+ if (name !== null && name !== "" && name !== "__other") {
2028
+ let total = 0;
2029
+ let tarValue;
2030
+ for (let i = 0, l = dataY.length; i < l; i++) {
2031
+ total += dataY[i];
2032
+ if (dataX[i] === name) {
2033
+ tarValue = dataY[i];
2034
+ }
2035
+ }
2036
+ let p;
2037
+ if (total === 0) {
2038
+ p = 0
2039
+ } else {
2040
+ p = (accMul(accDiv(tarValue, total), 100)).toFixed(2);
2041
+ }
2042
+ return '{a|' + name + '}\n' + '{b|' + p + '%}\n' + '{c|' + tarValue + '}'
2043
+ }
2044
+ },
2045
+ textStyle: {
2046
+ rich: {
2047
+ a: {
2048
+ fontSize: 10,
2049
+ color: '#333333',
2050
+ fontFamily: 'Microsoft YaHei',
2051
+ fontWeight: 400,
2052
+ width: 90,
2053
+ },
2054
+ b: {
2055
+ fontSize: 10,
2056
+ color: '#999999',
2057
+ fontFamily: 'Microsoft YaHei',
2058
+ fontWeight: 400,
2059
+ width: 50,
2060
+ lineHeight: 12
2061
+ },
2062
+ c: {
2063
+ fontSize: 13,
2064
+ color: '#333333',
2065
+ fontFamily: "BAHNSCHRIFT",
2066
+ fontWeight: "bold",
2067
+ }
2068
+ }
2069
+ }
2070
+
2071
+ },
2072
+ series: pieSeries
2073
+ };
2074
+ }
2075
+ }
2076
+ else if (type === '40' || type === '41' || type === '42' || type === '43') {
2077
+ if (type === '40') {
2078
+ const sortedDataX = dataY.slice().sort((a, b) => a - b);
2079
+ let total = dataY.reduce((a, b) => a + b);
2080
+ opt = {
2081
+ backgroundColor: '#fff',
2082
+ color: colors,
2083
+ legend: {
2084
+ type: 'scroll',
2085
+ orient: 'horizontal',
2086
+ left: 'center',
2087
+ bottom: "10%",
2088
+ selectedMode: true,
2089
+ data: dataX.map((name, index) => {
2090
+ const value = dataY[index];
2091
+ let p;
2092
+ if (total === 0) {
2093
+ p = 0
2094
+ } else {
2095
+ p = (accMul(accDiv(value, total), 100)).toFixed(2)
2096
+ }
2097
+ const ratio = total !== 0 ? p + '%' : '0%';
2098
+ const ratioString = ratio.toString();
2099
+ const res = name + "\n" + ratioString;
2100
+ return {
2101
+ name: res,
2102
+ };
2103
+ })
2104
+ },
2105
+ series: [
2106
+ {
2107
+ zlevel: 1,
2108
+ name: '',
2109
+ type: 'funnel',
2110
+ left: '15%',
2111
+ top: 25,
2112
+ bottom: 90,
2113
+ width: '50%',
2114
+ height: '60%',
2115
+ min: 0,
2116
+ max: 300,
2117
+ minSize: '0%',
2118
+ maxSize: '100%',
2119
+ sort: 'descending',
2120
+ gap: -1,
2121
+ smooth: true, // 设置平滑边
2122
+ label: {
2123
+ show: true,
2124
+ position: 'right',
2125
+ width: '200px',
2126
+ align: 'right',
2127
+ formatter: function (params) {
2128
+ return params.data.showname;
2129
+ }
2130
+ },
2131
+ labelLine: {
2132
+ length: 10,
2133
+ lineStyle: {
2134
+ width: 1,
2135
+ type: 'solid'
2136
+ }
2137
+ },
2138
+ itemStyle: {
2139
+ borderColor: '#fff',
2140
+ borderWidth: 1
2141
+ },
2142
+ emphasis: {
2143
+ label: {
2144
+ fontSize: 20
2145
+ }
2146
+ },
2147
+ data: dataY.map((value, index) => {
2148
+ const rank = sortedDataX.indexOf(value) + 1;
2149
+ let p;
2150
+ if (dataY.reduce((a, b) => a + b) === 0) {
2151
+ p = 0
2152
+ } else {
2153
+ p = (accMul(accDiv(value, dataY.reduce((a, b) => a + b)), 100)).toFixed(2)
2154
+ }
2155
+ let d;
2156
+ if (dataY.reduce((a, b) => a + b)) {
2157
+ d = 0
2158
+ } else {
2159
+ d = (accMul(accDiv(value, dataY.reduce((a, b) => a + b)), 100)).toFixed(2)
2160
+ }
2161
+ return {
2162
+ value: rank * 60,
2163
+ name: dataX[index] + "\n" + p + '%',
2164
+ showname: dataX[index],
2165
+ reaVal: d + '%'
2166
+ }
2167
+ })
2168
+ },
2169
+ ]
2170
+ };
2171
+ }
2172
+ else if (type === '41') {
2173
+ let formatUtil = echarts.format
2174
+ opt = {
2175
+ backgroundColor: '#fff',
2176
+ title: { text: "" },
2177
+ legend: {
2178
+ orient: 'horizontal',
2179
+ left: 'center',
2180
+ bottom: 10,
2181
+ selectedMode: true,
2182
+ data: dataX
2183
+ },
2184
+ tooltip: {
2185
+ formatter: function (info) {
2186
+ let value = info.value;
2187
+ let treePathInfo = info.treePathInfo;
2188
+ let treePath = [];
2189
+
2190
+ for (let i = 1; i < treePathInfo.length; i++) {
2191
+ treePath.push(treePathInfo[i].name);
2192
+ }
2193
+ return [
2194
+ '<div class="tooltip-title">' + formatUtil.encodeHTML(treePath.join('')) + '</div>',
2195
+ '占比: ' + formatUtil.addCommas(value) + ' %',
2196
+ ].join('');
2197
+ }
2198
+ },
2199
+ series: [{
2200
+ type: 'treemap',
2201
+ roam: false,
2202
+ nodeClick: false,
2203
+ width: 250,
2204
+ height: 180,
2205
+ breadcrumb: {
2206
+ show: false
2207
+ },
2208
+ label: {
2209
+ show: true,
2210
+ fontSize: 14
2211
+ },
2212
+ itemStyle: {
2213
+ normal: {
2214
+ borderColor: '#fff'
2215
+ }
2216
+ },
2217
+ levels: getLevelOption(),
2218
+ data: generateTestData(dataX, dataY)
2219
+ }]
2220
+ }
2221
+ }
2222
+ else if (type === '42') {
2223
+ let data = []
2224
+ let links = []
2225
+ for (let i = 0; i < dataX.length; i++) {
2226
+ data.push({
2227
+ name: dataX[i],
2228
+ itemStyle: {
2229
+ color: colors[i]
2230
+ }
2231
+ })
2232
+ }
2233
+ for (let i = 0; i < dataY.length; i++) {
2234
+ links.push({
2235
+ source: dataY[i][0],
2236
+ target: dataY[i][1],
2237
+ value: dataY[i][2],
2238
+ })
2239
+ }
2240
+ opt = {
2241
+ backgroundColor: '#fff',
2242
+ tooltip: {
2243
+ trigger: 'item'
2244
+ },
2245
+ series: [
2246
+ {
2247
+ type: 'sankey',
2248
+ emphasis: {
2249
+ focus: 'trajectory',
2250
+ },
2251
+ data: data,
2252
+ links: links,
2253
+ },
2254
+ ]
2255
+ }
2256
+ } else if (type === '43') {
2257
+ let newArry = [];
2258
+ let dataX_new = dataX[0];
2259
+ let dataY_new = dataY;
2260
+ for (let i = 0; i < dataX_new.length; i++) {
2261
+ newArry.push({
2262
+ 'name': dataY_new[i],
2263
+ 'value': dataX_new[i],
2264
+ });
2265
+ }
2266
+ let barOut = 65, barIn = 62, barBroad = 4;//控制圆环条宽度 barOut - barIn = 圆环条宽度,barBroad - 圆环条宽度 = 圆环条间距
2267
+ if (dataY.length <= 7) {//根据数据量选择合适的宽度,7条及以下数据将放宽圆环条
2268
+ barOut = 65;
2269
+ barIn = 58;
2270
+ barBroad = 8;
2271
+ } else if (dataY.length >= 14) {
2272
+ barOut = 65;
2273
+ barIn = 63;
2274
+ barBroad = 3;
2275
+ }
2276
+ let series = []
2277
+ for (let index = 0; index < dataY.length; index++) {
2278
+ series.push({
2279
+ type: 'gauge',
2280
+ center: ['50%', '50%'],
2281
+ radius: (barOut + barIn) / 2 - index * barBroad + '%',
2282
+ startAngle: 225,
2283
+ endAngle: -45,
2284
+ clockwise: true,
2285
+ min: 0,
2286
+ max: 100,
2287
+ data: [newArry[index]],
2288
+ splitLine: {
2289
+ show: false
2290
+ },
2291
+ axisTick: {
2292
+ show: false
2293
+ },
2294
+ pointer: {
2295
+ show: false
2296
+ },
2297
+ axisLabel: {
2298
+ show: false
2299
+ },
2300
+ axisLine: {
2301
+ roundCap: true,
2302
+ lineStyle: {
2303
+ width: (barOut - barIn)
2304
+ }
2305
+ },
2306
+ title: {
2307
+ show: false,
2308
+ offsetCenter: [0, 0],
2309
+ fontFamily: 'Microsoft YaHei',
2310
+ },
2311
+ progress: {
2312
+ show: true,
2313
+ roundCap: true,
2314
+ width: (barOut - barIn)
2315
+ },
2316
+ detail: {
2317
+ show: false,
2318
+ formatter: "{value}%",
2319
+ fontFamily: 'Microsoft YaHei',
2320
+ }
2321
+ })
2322
+ }
2323
+ opt = {
2324
+ backgroundColor: '#fff',
2325
+ tooltip: {
2326
+ trigger: 'item',
2327
+ // formatter: '{b}:<br/> {d}%<br/>{c}'
2328
+
2329
+ },
2330
+ color: colors,
2331
+ series: series
2332
+ };
2333
+ }
2334
+ }
2335
+ return opt
2336
+ }
2337
+
2338
+ // 二维数组转置
2339
+ function transpose(matrix) {
2340
+ return matrix[0].map((_, colIndex) => matrix.map(row => row[colIndex]));
2341
+ }
2342
+
2343
+ // 十六进制颜色转RGBA
2344
+ const hexToRgba = (hex, opacity) => {
2345
+ const bigint = parseInt(hex.slice(1), 16);
2346
+ const r = (bigint >> 16) & 255;
2347
+ const g = (bigint >> 8) & 255;
2348
+ const b = bigint & 255;
2349
+
2350
+ return `rgba(${r}, ${g}, ${b}, ${opacity})`;
2351
+ };