前言
今天在做项目的时候,需要用echarts做一个数据展示,大概需求如下
- 前端搜索某一天时间,请求后端接口,返回数据
- 展示这一天数据的请求次数,拦截次数,和拦截率 — 因为要展示百分比所以要对echarts图标做特殊处理
- 如下效果图是根据自己写的随机数展示效果
自己做出这个图因为对echarts不是很熟练,百度编程了很久。如果你的需求差不多一样,可以借鉴使用。
开始实现
首先我这个效果是在vue项目实现的,其他项目没有实践。不过应该也可以,但是里面vue的语法肯定需要更换
-
要使用echarts,肯定是要在自己的项目安装他
npm install echarts --save -
在页面中具体使用
1.准备容器,必须设置宽高。而且在初始化的时候这个容器必须是要显示的,比如说不能用 v-if v-show等命令隐藏这个元素,否则会报错。
<template> <div class="charts" ref="charts"></div> </template> <style scoped> .charts { width: 100%; height: 400px; } </style>-
引入 ECharts
<script> import echarts from 'echarts/lib/echarts' import 'echarts/lib/chart/line' export default { methods: { getdata () { // 正常在做项目的时候,这个地方应该是请求接口拿到数据,这个地方为了方便,使用了自己生成的数据 this.charts = echarts.init(this.$refs.charts) // 初始化echarts实例 const timeList = [] //X轴数据 const data1 = [] // 请求次数数据 const data2 = [] // 拦截次数数据 const data3 = [] // 拦截率数据 for (var i = 0; i < 1440; i++) // 1440是一天分钟数量 // 这是保存X轴显示的数据,因为我的需求是一天每隔一分钟的数据 timeList[i] = moment((1629302400000 + (i * 60000))).format('MM/DD HH:mm') // 这里随机生成的1000以内的数字 data1[i] = parseInt(1000 * Math.random()) // 因为拦截此时必须小于请求次数 data2[i] = parseInt(data1[i] * Math.random()) // 拦截率 data3[i] = ((data2[i] / data1[i]) * 100).toFixed(2) } const op = { // 图表绘制 tooltip: { 鼠标移动到echarts时显示控制 trigger: 'axis', formatter: value => { // 拦截率要显示百分比,所以做了一下特殊处理 console.log(value) let name = `${value[0].axisValue}<br />` for (var i = 0; i < value.length; i++) { // 对拦截率添加了百分比 ,如果你是其他字符,修改一下这个判断就可以 if (value[i].seriesName === '拦截率') { name += `${value[i].seriesName} : ${value[i].value}%<br />` } else { name += `${value[i].seriesName} : ${value[i].value}<br />` } } return name } // '{b0}<br/>{a0}: {c0}<br />{a1}: {c1}<br />{a2}: {c2}%' }, legend: { data: ['请求次数', '拦截次数', '拦截率'] }, grid: { top: '8%', left: '3%', right: '4%', bottom: '5%', containLabel: true }, xAxis: { type: 'category', data: timeList // X轴显示的数据 }, yAxis: [ // 第一个对象设置左边显示的数据 { type: 'value', name: '请求次数/拦截次数' }, // 设置右边显示数据 { type: 'value', name: '拦截率', positon: 'right', // 一般情况下百分比从0到100 min: 0, max: 100, axisLabel: { show: true, interval: 'auto', formatter: '{value}%' //设置右边显示为xx% }, show: true } ], series: [ { data: data1, name: '请求次数', stack: '请求次数', type: 'line', symbol: 'none' // 取消折线图圆点 }, { data: data2, type: 'line', name: '拦截次数', stack: '拦截次数', symbol: 'none' }, { data: data3, type: 'line', name: '拦截率', stack: '拦截率', yAxisIndex: 1, symbol: 'none' // itemStyle: { // normal: { // label: { // show: true, // positon: 'top', // formatter: '{b}\n{c}%' // } // } // } } ] } this.charts.setOption(op) }, } } </script>
-
- 完整页面。 可以直接在自己项目一个新页面使用
<template>
<div class="charts" ref="charts"></div>
</template>
<script>
import echarts from 'echarts/lib/echarts'
import 'echarts/lib/chart/line'
export default {
data () {
return {
}
},
mounted () {
this.getdata()
window.onresize = () => {
this.charts.resize()
}
},
methods: {
getdata () {
this.charts = echarts.init(this.$refs.charts)
const timeList = []
const data1 = []
const data2 = []
const data3 = []
for (var i = 0; i < 1440; i++) {
timeList[i] = moment((1629302400000 + (i * 60000))).format('MM/DD HH:mm')
data1[i] = parseInt(1000 * Math.random())
data2[i] = parseInt(data1[i] * Math.random())
data3[i] = ((data2[i] / data1[i]) * 100).toFixed(2)
}
const op = {
tooltip: {
trigger: 'axis',
formatter: value => {
console.log(value)
let name = `${value[0].axisValue}<br />`
for (var i = 0; i < value.length; i++) {
if (value[i].seriesName === '拦截率') {
name += `${value[i].seriesName} : ${value[i].value}%<br />`
} else {
name += `${value[i].seriesName} : ${value[i].value}<br />`
}
}
return name
}
// '{b0}<br/>{a0}: {c0}<br />{a1}: {c1}<br />{a2}: {c2}%'
},
legend: {
data: ['请求次数', '拦截次数', '拦截率']
},
grid: {
top: '8%',
left: '3%',
right: '4%',
bottom: '5%',
containLabel: true
},
xAxis: {
type: 'category',
data: timeList
},
yAxis: [
{
type: 'value',
name: '请求次数/拦截次数'
},
{
type: 'value',
name: '拦截率',
positon: 'right',
min: 0,
max: 100,
axisLabel: {
show: true,
interval: 'auto',
formatter: '{value}%'
},
show: true
}
],
series: [
{
data: data1,
name: '请求次数',
stack: '请求次数',
type: 'line',
symbol: 'none'
},
{
data: data2,
type: 'line',
name: '拦截次数',
stack: '拦截次数',
symbol: 'none'
},
{
data: data3,
type: 'line',
name: '拦截率',
stack: '拦截率',
yAxisIndex: 1,
symbol: 'none'
// itemStyle: {
// normal: {
// label: {
// show: true,
// positon: 'top',
// formatter: '{b}\n{c}%'
// }
// }
// }
}
]
}
this.charts.setOption(op)
}
}
}
</script>
<style scoped>
.charts {
width: 100%;
height: 400px;
}
</style>