Echarts折线图表断点如何补全
Echarts折线图如何补全断点以及如何隐藏断点的title
做报表的时候,尤其是做图表的时候时常会碰到某一记录的值中缺少某个时间段(比如月份或季度)的值,导致图表显示残缺不全,for example:

如果照实显示的话确实不太美观(除非贵公司确实需要特别准确的数据除外~),当然我们的客户是做信托的,算钱的系统和时常开会追KPI的时候看报表系统~;给领导写报告图表当然不能太另类~\(≧▽≦)/~,遂业务部门的同学要求我们尽可能在数据准确的情况下将图表做的更美观些些,...吾以为这个貌似难难滴欸。。。。,怎么办。。。。,研究来研究去,之后我们将报表做成了这样纸>>>

感觉挺好的,不知业务的妹纸是否满意(✿◡‿◡)
且细看....细看,比如图中34个月与35个月是没有数据滴,哈哈,成功!!
一下分享下我的思路:
A>首先要取得所有部门的期限内的所有数据(当然这个过程你需要自己码代码获得一份完整的月份数据,要不然你怎么知道记录的断点位置呢,是不?)
B>然~,整理你的数据,分层是必要的(如果数据库能按按部门分层月份,干嘛还要这么累啊(=@__@=))
C>再~,两层遍历,等等干什么呢?-->这是要找出断点,并用统一的mark以标示
(具体就是外层循环月份List,然后遍历所有的按部门归类的部门的月份找出此部门再哪个期限缺值)
D>然~,看似以上已经找出了断点了,但试想下如果这些断点都是以‘—’补全,图还是会断啊~~~,怎么办;
啊哈 so easy~ 将此断点补上前后两个值的平均值不就是一条直线啦,啦啦啦~
E>啦啦啦,搞定\(^o^)/YES! 。。。。,浏览器打开页面~ (⊙﹏⊙)b 为什么为什么为什么还会显示title呢,
这样会暴露程序猿的审美····,how? 官方API搞定....
直接放代码可能让各位一头雾水,先给一份样例数据方便大家调试:

下图是具体代码:
注:echarts需要的数据样例如19~31注释部分
37~40行获取limits数据,也就是x轴月份数据
30~56行处理echarts分层数据(按部门划分)
62~121行处理断点数据(将已经分层的里面的月份‘—’处理成前后值的平均数,使折线平滑)
在这个之前需要对月份数据排序(从小到大排序),方法在最下面哈
至于怎么将断点数据默认不显示,呢,答案很简单->请注意104行里面有个参数:“symbol:'none'”,这是官方API
如对最后的图表的结构数据不懂,请看这里,看这里:http://echarts.baidu.com/echarts2/doc/example/line2.html
function generateChart04() {
var detailData = module.page["allFundStatD4s"].detaillist,
legendData=[],//标题名称组
limits=[],//期限
myData={},//系列数据
label={normal:{
show: true,
//position: 'top',
formatter: '{c}%'
}},
seriesData=[];
/**
* A>构建系列结构数据
* B>系列数据格式化和断点处理
* C>图表显示样式处理
*/
/*
* 系列数据样例->
* {"广州管理部":{
* "期限":{1:0.173,6:0.863,9:0.777,12:0.66,36:0.039},#myLimits
* "datas"{"广州管理部",type:"line",data:"(取)期限",
* label:{
* normal: {
show: true,
position: 'top',
formatter: '{c}%'
},
* }
* }
* }
* }
*/
for(var i in detailData){
//如果没有当前legend值,先初始化新建个;如果有,则更新当前期限值
if(!myData[detailData[i].deptName]){
legendData.push(detailData[i].deptName);//放入图表标题数组中
if(limits.indexOf(detailData[i].realTimeLimit)==-1){//不存在
//if(!(limits.includes(detailData[i].realTimeLimit))){
limits.push(detailData[i].realTimeLimit);//放入期限数组中
}
myData[detailData[i].deptName]={};//声明
myData[detailData[i].deptName].myLimits={};//声明
myData[detailData[i].deptName].myLimits[detailData[i].realTimeLimit]=detailData[i].compositeCost;//放入期限
myData[detailData[i].deptName].datas={};
myData[detailData[i].deptName].datas.name=detailData[i].deptName;//当前legend放入名称
myData[detailData[i].deptName].datas.type="line";//当前legend放入类型
myData[detailData[i].deptName].datas.data=[];//先预留,取到所有系列数据后再填入数据
myData[detailData[i].deptName].datas.label=label;//线型预设值
}else{
if(limits.indexOf(detailData[i].realTimeLimit)==-1){//不存在
//if(!(limits.includes(detailData[i].realTimeLimit))){
limits.push(detailData[i].realTimeLimit);//放入期限数组中
}
myData[detailData[i].deptName].myLimits[detailData[i].realTimeLimit]=detailData[i].compositeCost;//放入期限
}
}
limits.sort();//从小到大排序
/**
* 遍历各个legend
* 填补当前legend的节点数据为‘-’(以便后续对此节点补充平均值以使折线不出现明显的断点)
*/
for(var j in myData){
for(var k in limits){
if(myData[j].myLimits[limits[k]]){
myData[j].datas.data.push((myData[j].myLimits[limits[k]]*100).toFixed(2));
//myData[j].datas.data.push(myData[j].myLimits[limits[k]]==-1?0:(myData[j].myLimits[limits[k]]*100).toFixed(2));
}else{
myData[j].datas.data.push("-");
}
}
/**
* 中间断点的补全中间断点
*/
//[-,-,0,99,-,5,-,-];
var before=0,after=0,cnode=0,idx=0;
for(var m in myData[j].datas.data){
idx=idx+1;
if(myData[j].datas.data[m]=="-"){
//continue;//返回,进行下一次循环
if(m==0){
continue;
}else{
if(before>0){
cnode=cnode+1;
after=idx-1;
}
}
if(myData[j].datas.data[m]==(myData[j].datas.data.length-1)){
//初始化标记值
before=0;
after=0;
cnode=0;
}
}else{
if(cnode==0){
before=idx-1;//当前数据的下标的位置
after=idx-1;//当前数据下标的位置
}else{
after=idx-1;
cnode=cnode+1;
for(var n=1;n<cnode;n++){
//myData[j].datas.data[before+n]=(Number(myData[j].datas.data[before])+(myData[j].datas.data[after]-myData[j].datas.data[before])/cnode*n).toFixed(2);
myData[j].datas.data[before+n]={name:limits[before+n]+ "个月", symbol:'none', value:(Number(myData[j].datas.data[before])+(myData[j].datas.data[after]-myData[j].datas.data[before])/cnode*n).toFixed(2)};
}
cnode=0;
before=idx-1;
}
if(!(myData[j].datas.data[Number(m)+1])){//下一个节点是否存在
//存在"-":continue;
//存在number:
//初始化标记值
before=0;
after=0;
cnode=0;
}
}
}
seriesData.push(myData[j].datas);
}
//X轴数据添加后缀
for(var l in limits){
limits[l]=limits[l]+"个月";
}
var myChart = echarts.init(document.getElementById('chart4'),'macarons');
option = {
title : {
text: '按部门期限分布',
x:'center',
y:'20px',
position:'top'
},
grid:{
y:'80px', //直角坐标系内绘图网格左上角纵坐标,默认值60
x:'150px',
x2:'1%',
y2:'9%'
},
tooltip : {
trigger: 'axis',
formatter:function(params)
{
var relVal;
if (Array.isArray(params)) { //显示各项数据时,params为数组
relVal = params[0].name;
for (var i = 0, l = params.length; i < l; i++) {
relVal += '<br/><span style="display:inline-block;margin-right:5px;border-radius:10px;width:9px;height:9px;background-color:' + params[i].color + '"></span>'
relVal += params[i].seriesName + ' : ' + params[i].value+"%";
}
} else { //显示平均数时,params为对象
relVal = params.name;
relVal += '<br/>' + params.seriesName + ' : ' + params.value+"%";
}
return relVal;
}
},
legend: {
data: legendData,//['资金成本','指导价'],
y:"center",//y:'20px;',
x:"left",
orient:"vertical"
},
toolbox: {
show : true,
// orient:"vertical",
feature: {
dataView : {show: true, readOnly: false},
magicType : {show: true, type: ['line', 'bar']},
restore : {show: true},
saveAsImage : {show: true, backgroundColor:'transparent'}
}
},
xAxis:{
/* type: 'category', */
position:'right',
data: limits,
boundaryGap: true,
axisLabel:{
interval:0,
rotate:45,//倾斜度 -90 至 90 默认为0
},
},
yAxis: {
type: 'value',
boundaryGap: [0.3, 0.3],
scale: true,
axisLabel: {
//formatter: '{value}%'
formatter: function (value, index) {
if(value.toString().length>5){
return Number(value.toFixed(5))+"%";
}else{
return value+"%";
}
}
}
},
series :seriesData,
};
myChart.setOption(option);
}
//数组按按数字从小到大排序
function (val, nextVal) {
return val-nextVal;
}
....=========啦啦啦啦~啦啦啦~( ̄▽ ̄~)(~ ̄▽ ̄)~=========....
Echarts折线图表断点如何补全的更多相关文章
- echarts 纵坐标数字太长显示补全,以及文字倾斜显示
如上数字太长,显示补全,以及x坐标的月份当数量大的时候也会显示补全: x可以调节纵坐标label的宽度 y2可以调节横坐标label的高度 grid: { x: 100, //默认是80px y: 6 ...
- ECharts数据图表系统? 5分钟上手!
目录: 前言 简介 方法一:模块化单文件引入(推荐) 方法二:标签式单文件引入 [前言] 最近在捣鼓各种插件各种框架,发现这个ECharts还是比较不错的,文档也挺全的,还是中文的,给大家推荐一下. ...
- IntelliJ IDEA 设置代码提示或自动补全的快捷键 (附IntelliJ IDEA常用快捷键)
修改方法如下: 点击 文件菜单(File) –> 点击 设置(Settings- Ctrl+Alt+S), –> 打开设置对话框. 在左侧的导航框中点击 KeyMap. 接着在右边的树型框 ...
- Echarts数据可视化visualMap,开发全解+完美注释
全栈工程师开发手册 (作者:栾鹏) Echarts数据可视化开发代码注释全解 Echarts数据可视化开发参数配置全解 6大公共组件详解(点击进入): title详解. tooltip详解.toolb ...
- Echarts数据可视化dataZoom,开发全解+完美注释
全栈工程师开发手册 (作者:栾鹏) Echarts数据可视化开发代码注释全解 Echarts数据可视化开发参数配置全解 6大公共组件详解(点击进入): title详解. tooltip详解.toolb ...
- Echarts调整图表上下左右的间距,Echarts调整柱状图左右的间距
Echarts调整图表上下左右的间距,Echarts调整柱状图左右的间距 >>>>>>>>>>>>>>>> ...
- echarts使用技巧(一)echarts的图表自适应resize问题、单选、缩放等
这些东西要是有精力和时间可以通读echarts文档,里面都有配置详细介绍.该博客只是把自己使用echarts遇到的问题记录下,并不全,加深印象,抛砖引玉而已,完整学习的请移步官方文档 1.legend ...
- 自动补全、回滚!介绍一款可视化 sql 诊断利器
Yearning简介 ================= Yearning MYSQL 是一个SQL语句审核平台.提供查询审计,SQL审核等多种功能,支持Mysql,可以在一定程度上解决运维与开发之间 ...
- Oracle补全日志(Supplemental logging)
Oracle补全日志(Supplemental logging)特性因其作用的不同可分为以下几种:最小(Minimal),支持所有字段(all),支持主键(primary key),支持唯一键(uni ...
随机推荐
- 一步一步实现基于GPU的pathtracer(一):基础
出于3D计算机图形学和图形渲染方面的个人兴趣,脑子里便萌生出了自己实现一个渲染器的想法,主要是借助pathtracing这种简单的算法,外加GPU加速来实现,同时也希望感兴趣的朋友们能够喜欢,也欢迎提 ...
- 一天搞定CSS:层级(z-index)--18
因为定位的出现,所以有了元素重叠的情况,此时就出现了显示谁的情况.在多层布局时,容易出现这种情况 定位position见:http://blog.csdn.net/baidu_37107022/art ...
- [codeforces167B]Wizards and Huge Prize
B. Wizards and Huge Prize time limit per test: 2 seconds memory limit per test: 256 megabytes input: ...
- JavaScript数组知识点
强类型语言数组特点:连续的,指定好长度, 还要规定好数据类型弱类型语言数组特点:不一定是连续的 可以不用指定长度 不限定数据类型(可以存储任意类型的数据)数组定义方式:1.var arr=new Ar ...
- springmvc 之 DispatcherServlet
DispatcherServlet说明 使用Spring MVC,配置DispatcherServlet是第一步. DispatcherServlet是一个Servlet,所以可以配置多个Dispat ...
- MongoDB--GridFS 文件存储系统
GridFS是Mongo的一种专门用存储小型文件的功能. 使用于下列场景: 1.写入文件:mongofiles put 文件路径 注意,当前mongo实例链接的哪个库,将写文件在哪个实例里面的grid ...
- ecshop加入购物车效果(各个页面)
ecshop中点击加入购物车出现下图 通过以下代码改成下图效果 1.后台网店设置 购物车确定提示 选择为“提示用户,点击“确定”进购物车” 2.打开js/common.js 104行就是funct ...
- arcgis api for js入门开发系列十叠加SHP图层
上一篇实现了demo的热力图,本篇新增叠加SHP图层,截图如下: 叠加SHP图层效果实现的思路如下:利用封装的js文件,直接读取shp图层,然后转换geojson,最后通过arcgis api来解析转 ...
- excel转html 实现在线预览
首先说一下,本人发布的代码都是经过本人亲测,并且用在实际项目中.如果觉得可以,希望大家点个赞,谢谢大家. 有什么问题,大家评论出来,一起交流.好了,不废话了,下面来说一说这个东西怎么做. 网上也有许多 ...
- Linux编程之select
select系统调用的的用途是:在一段指定的时间内,监听用户感兴趣的文件描述符上可读.可写和异常等事件. select 机制的优势 为什么会出现select模型? 先看一下下面的这句代码: int i ...