格式化数字,三个数字一个逗号

1
2
3
4
5
6
7
8
export function parseNumber(num) {
try {
let newNum = parseInt(num)
return newNum.toLocaleString()
} catch (error) {
return 0
}
}

环形图添加百分比显示

在 series 中添加如下代码表示在页面上会显示百分比

Snipaste_2022-05-07_17-19-57.png

1
2
3
4
5
label: {
formatter(val) {
return `${val.name} ${parseNumber(val.value)} (${val.percent}%)`
}
}

在 tooltip 中添加如下代码,会在鼠标悬浮上去时显示百分比,其中 val.marker 表示每个颜色小圆点

Snipaste_2022-05-07_17-21-26.png

1
2
3
formatter(val) {
return `${val.marker}${val.name} ${parseNumber(val.value)} (${val.percent}%)`
}

图示

Snipaste_2022-05-07_17-23-46.png

设置柱状图的x轴位置倾斜

在 xAxis 中添加如下代码即可实现文字倾斜,在文字过长时使用

Snipaste_2022-05-07_17-28-50.png

1
2
3
axisLabel: {
rotate: 20 // 倾斜30度
}

图示

Snipaste_2022-05-07_17-30-58.png

修改环形图圆环大小

在 series 中添加 radius,第一个数字表示中心圆的大小,数字越大,中心的圆越大。第二个数字表示环形图本身的大小

Snipaste_2022-05-07_17-36-39.png

图示

Snipaste_2022-05-07_17-38-59.png

Snipaste_2022-05-07_17-40-07.png

x轴数据过长时显示滚动条

和 xAxis 平级添加如下代码即可实现滚动条

Snipaste_2022-05-07_17-32-59.png

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
dataZoom: [
{
type: 'slider',
realtime: true,
start: 0,
end: 40, // 数据窗口范围的结束百分比。范围是:0 ~ 100。
height: 20, // 组件高度
left: 5, // 左边的距离
right: 5, // 右边的距离
bottom: 10, // 下边的距离
show: true, // 是否展示
fillerColor: 'rgba(17, 100, 210, 0.42)', // 滚动条颜色
borderColor: 'rgba(17, 100, 210, 0.12)',
handleSize: 0, // 两边手柄尺寸
showDetail: false, // 拖拽时是否展示滚动条两侧的文字
zoomLock: true, // 是否只平移不缩放
moveOnMouseMove: false // 鼠标移动能触发数据窗口平移
// zoomOnMouseWheel: false, //鼠标移动能触发数据窗口缩放
},
{
type: 'inside', // 支持内部鼠标滚动平移
start: 0,
end: 40,
zoomOnMouseWheel: false, // 关闭滚轮缩放
moveOnMouseWheel: true, // 开启滚轮平移
moveOnMouseMove: true // 鼠标移动能触发数据窗口平移
}
],

图示

Snipaste_2022-05-07_17-33-42.png

添加局部Loading

首先封装 loading.js

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
import Vue from 'vue'

// loading框设置局部刷新,且所有请求完成后关闭loading框
let loading
let needLoadingRequestCount = 0 // 声明一个对象用于存储请求个数
function startLoading (targetdq) {
loading = Vue.prototype.$loading({
lock: true,
text: '', // 显示的loading文字
background: 'rgba(255,255,255,.4)',
target: document.querySelector(targetdq) // 设置加载动画区域
})
}

function endLoading () {
loading.close()
}
export function showLoading (targetdq) {
if (needLoadingRequestCount === 0) {
startLoading(targetdq)
}
needLoadingRequestCount++
}
export function hideLoading () {
if (needLoadingRequestCount <= 0) return
needLoadingRequestCount--
if (needLoadingRequestCount === 0) {
endLoading()
}
}

export default {
showLoading,
hideLoading
}

然后导出使用

1
2
3
4
5
6
7
import { showLoading, hideLoading } from '../../../utils/loading'

showLoading('.b-white')

setTimeout(() => {
hideLoading()
}, 2000);

效果

Snipaste_2022-05-07_17-42-33.png

设置数据的最大值,不让柱状图直接顶到头

在 xAxis 中设置 max,放置柱状图直接订到头,不好看

Snipaste_2022-05-07_17-45-38.png

效果:

Snipaste_2022-05-07_17-47-09.png

上图中左右对比图的实现代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
<template>
<div class="card b-white" style="height: 950px">
<p class="chart-title">{{ title }}</p>
<Echarts class="chart-pane" height="95%" :dom-id="domId" :options="data" />
</div>
</template>
<script>
import Echarts from '@/components/Echarts'
import { getCustomerDistributionInfo } from '@/api/report'
import { showLoading, hideLoading } from '../../../utils/loading'
export default {
components: { Echarts },
props: ['year'],
data() {
return {
title: `客户分布情况;左${this.year},右${this.year - 1}`,
type: '',
domId: Math.random(),
data: {}
}
},
watch: {
year(val) {
this.getData()
}
},
mounted() {
this.getData()
},
methods: {
getData() {
showLoading('.b-white')
getCustomerDistributionInfo().then((res) => {
hideLoading()
console.log(res.data.rows)
const data2022 = []
const data2021 = []
// 右边的图
res.data.rows.right.forEach((item, index) => {
data2021.push({
name: item.name,
type: 'bar',
stack: 'Total' + index,
barWidth: '15',
label: {
show: true,
position: 'inside'
},
emphasis: {
focus: 'series'
},
data: item.data
})
})
// 左边的图
res.data.rows.left.forEach((item, index) => {
data2022.push({
name: item.name,
type: 'bar',
stack: 'Total' + index,
label: {
show: true,
position: 'inside',
formatter(value) {
if (value.data < 0) {
return -value.data
}
}
},
emphasis: {
focus: 'series'
},
data: item.data.map((i) => i * -1)
})
})

const that = this

this.data = {
tooltip: {
trigger: 'axis',
axisPointer: {
type: 'shadow'
},
formatter(val) {
return `

${that.year}<br>
${val[7].marker}${val[7].seriesName}\t
${val[7].value < 0 ? val[7].value * -1 : val[7].value}<br>
${val[8].marker}${val[8].seriesName}\t
${val[8].value < 0 ? val[8].value * -1 : val[8].value}<br>
${val[9].marker}${val[9].seriesName}\t
${val[9].value < 0 ? val[9].value * -1 : val[9].value}<br>
${val[10].marker}${val[10].seriesName}\t
${val[10].value < 0 ? val[10].value * -1 : val[10].value}<br>
${val[11].marker}${val[11].seriesName}\t
${val[11].value < 0 ? val[11].value * -1 : val[11].value}<br>
${val[12].marker}${val[12].seriesName}\t
${val[12].value < 0 ? val[12].value * -1 : val[12].value}<br>
${val[13].marker}${val[13].seriesName}\t
${val[13].value < 0 ? val[13].value * -1 : val[13].value}<br>
${that.year - 1}<br>
${val[0].marker}${val[0].seriesName}\t
${val[0].value < 0 ? val[0].value * -1 : val[0].value} <br>
${val[1].marker}${val[1].seriesName}\t
${val[1].value < 0 ? val[1].value * -1 : val[1].value} <br>
${val[2].marker}${val[2].seriesName}\t
${val[2].value < 0 ? val[2].value * -1 : val[2].value}<br>
${val[3].marker}${val[3].seriesName}\t
${val[3].value < 0 ? val[3].value * -1 : val[3].value}<br>
${val[4].marker}${val[4].seriesName}\t
${val[4].value < 0 ? val[4].value * -1 : val[4].value}<br>
${val[5].marker}${val[5].seriesName}\t
${val[5].value < 0 ? val[5].value * -1 : val[5].value}<br>
${val[6].marker}${val[6].seriesName}\t
${val[6].value < 0 ? val[6].value * -1 : val[6].value}
`
}
},
legend: {},
grid: {
left: '3%',
right: '4%',
bottom: '3%',
containLabel: true
},
xAxis: [
{
type: 'value',
max: (value) => {
console.log(value) // value是包含数值最大最小值的对象
return value.max + 2
},
min: (value) => {
console.log(value) // value是包含数值最大最小值的对象
return (value.max + 2) * -1
},
axisLabel: {
// 把x轴的负数改成正数
formatter(value) {
if (value < 0) {
return -value
} else {
return value
}
}
}
}
],
yAxis: [
{
type: 'category',
axisTick: {
show: false
},
data: [
'0-50万',
'50-100万',
'100-300万',
'300-500万',
'500万以上'
]
}
],
series: [...data2021, ...data2022]
}
})
}
}
}
</script>
<style lang="scss" scoped>
.chart-title {
font-size: 15px;
padding: 10px;
background: #fff;
}
.card {
padding: 10px;
background: white;
}
</style>

设置在柱状图中显示数字

在 series 中添加 position,表示数字的显示位置

1
2
3
4
5
label: {
show: true,
position: 'top',
color: 'black'
}

效果

Snipaste_2022-05-07_17-51-24.png

设置图例分页

当图例过多时,会拥挤到一块不好看,我们通过让图例分页,只在一行展示

在 legend 中添加如下代码

1
type: 'scroll'

Snipaste_2022-05-07_17-53-59.png

效果:

Snipaste_2022-05-07_17-55-11.png

Snipaste_2022-05-07_17-55-42.png