grafana multi bar graph通过echart插件实现单点多条

grafana提供时序数据展示,但默认的模板(Time series和Graph_old)无法满足需求,这两种模板在处理多柱状图对应单时间点时不管是堆叠还是不堆叠,都只会显示在一根柱子上,十分影响体验,grafana的默认模板只能做到如下图的情况,让人很无语:

同时也尝试了用自带的 bar chart 模块,但是X轴时间转换不是很灵活,只能展示时间戳,如下图:如果不是时间格式,理论上也是可以用的

本文将介绍如何通过echart模块来实现多条行图对应单时间点,如下图所示,清晰又美观。

一、给grafana安装echart插件
安装grafana的过程大家可以自行谷歌,在这里就不赘述了,我们直接安装echart插件,在下面这个链接里:https://grafana.com/grafana/plugins/bilibala-echarts-panel 安装以后在图表编辑的右侧即可看到下图的图标:

二、添加echart模版
这一步直接去echart网站找你想要的模板即可,当然在修改的过程中需要有一定的前端基础,能熟练运用js函数即可,我们找了一个符合自己需求的多条形图对应单时间的模板,链接如下:https://echarts.apache.org/examples/zh/editor.html?c=dataset-simple0
三、前端代码分析
//在grafana中,默认从数据库读出数据的方法就是 data.series,所以可以先开 console.log(data) 看看数据结构,grafana在我看来就是替代了excel的出图功能,出什么样的图首先看你的表是不是规范。
const resData = data.series[0].fields
//时间转换方法,将X轴改为你想要的格式,比如我这里想要YYYY-mm格式,当然要保证你的数据表时间列是时间格式,否则无法转换。
function dateFormat(fmt, date) {
let ret="";
date=new Date(date);
const opt = {
'Y+': date.getFullYear().toString(), // 年
'm+': (date.getMonth() + 1).toString(), // 月
'd+': date.getDate().toString(), // 日
'H+': date.getHours().toString(), // 时
'M+': date.getMinutes().toString(), // 分
'S+': date.getSeconds().toString() // 秒
// 有其他格式化字符需求可以继续添加,必须转化成字符串
}
for (let k in opt) {
ret = new RegExp('(' + k + ')').exec(fmt)
if (ret) {
fmt = fmt.replace(
ret[1],
ret[1].length == 1 ? opt[k] : opt[k].padStart(ret[1].length, '0')
)
}
}
return fmt
};
//判断为空
if(resData.length == 0){
return
}
//数据处理
//1.legend数据
let legend = []
resData.forEach(item=>{
legend.push(item.name)
})
legend.push('目标')
//2.时间转换
let time = []
resData[0].values.buffer.forEach(item=>{
item = dateFormat('YYYY-mm',item)
time.push(item)
})
//3.数据插入
option = {
color:['#3DA72F','#F2CB0E','#8AB8FF','#FF7808','#B877D9','#F2485C'],
legend: {data:legend.slice(1,),top:0},
tooltip: {trigger: "axis",
axisPointer: {
type: "cross",
crossStyle: {
color: "#999",
},
},},
xAxis: { type: 'category',data:time },
yAxis: {},
// Declare several bar series, each will be mapped
// to a column of dataset.source by default.
series: [{ name:'A部门',type: 'bar',data:resData[1].values.buffer },
{ name:'B部门',type: 'bar',data:resData[2].values.buffer },
{ name:'C部门',type: 'bar',data:resData[3].values.buffer },
{ name:'D部门',type: 'bar',data:resData[4].values.buffer },
{ name:'X部门',type: 'bar',data:resData[5].values.buffer },
{ name:'目标',type: 'line',data:[3,3,3,3,2,2,2,2,2,1,1,1] }
]
};
echartsInstance.setOption(option);以下就是本次修改的成果:
