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折线图表断点如何补全的更多相关文章

  1. echarts 纵坐标数字太长显示补全,以及文字倾斜显示

    如上数字太长,显示补全,以及x坐标的月份当数量大的时候也会显示补全: x可以调节纵坐标label的宽度 y2可以调节横坐标label的高度 grid: { x: 100, //默认是80px y: 6 ...

  2. ECharts数据图表系统? 5分钟上手!

    目录: 前言 简介 方法一:模块化单文件引入(推荐) 方法二:标签式单文件引入 [前言] 最近在捣鼓各种插件各种框架,发现这个ECharts还是比较不错的,文档也挺全的,还是中文的,给大家推荐一下. ...

  3. IntelliJ IDEA 设置代码提示或自动补全的快捷键 (附IntelliJ IDEA常用快捷键)

    修改方法如下: 点击 文件菜单(File) –> 点击 设置(Settings- Ctrl+Alt+S), –> 打开设置对话框. 在左侧的导航框中点击 KeyMap. 接着在右边的树型框 ...

  4. Echarts数据可视化visualMap,开发全解+完美注释

    全栈工程师开发手册 (作者:栾鹏) Echarts数据可视化开发代码注释全解 Echarts数据可视化开发参数配置全解 6大公共组件详解(点击进入): title详解. tooltip详解.toolb ...

  5. Echarts数据可视化dataZoom,开发全解+完美注释

    全栈工程师开发手册 (作者:栾鹏) Echarts数据可视化开发代码注释全解 Echarts数据可视化开发参数配置全解 6大公共组件详解(点击进入): title详解. tooltip详解.toolb ...

  6. Echarts调整图表上下左右的间距,Echarts调整柱状图左右的间距

    Echarts调整图表上下左右的间距,Echarts调整柱状图左右的间距 >>>>>>>>>>>>>>>> ...

  7. echarts使用技巧(一)echarts的图表自适应resize问题、单选、缩放等

    这些东西要是有精力和时间可以通读echarts文档,里面都有配置详细介绍.该博客只是把自己使用echarts遇到的问题记录下,并不全,加深印象,抛砖引玉而已,完整学习的请移步官方文档 1.legend ...

  8. 自动补全、回滚!介绍一款可视化 sql 诊断利器

    Yearning简介 ================= Yearning MYSQL 是一个SQL语句审核平台.提供查询审计,SQL审核等多种功能,支持Mysql,可以在一定程度上解决运维与开发之间 ...

  9. Oracle补全日志(Supplemental logging)

    Oracle补全日志(Supplemental logging)特性因其作用的不同可分为以下几种:最小(Minimal),支持所有字段(all),支持主键(primary key),支持唯一键(uni ...

随机推荐

  1. JSON数据解析:Gson(谷歌)和fastjson(阿里巴巴)的异同点

    Gson和fastjson分别为谷歌和阿里巴巴对JSON数据进行处理封装的jar包 Gson(谷歌)和fastjson(阿里巴巴)两者异同点: 相同点:都是根据JSON数据创建相应的类 不同点: 1. ...

  2. 面向对象(java菜鸟的课堂笔记)

    类:相同的东西放在一起 分为属性和动作: 把一组或多组事物相同的特性的描述==>类   属性和动作被称为成员: //声明类的属性信息 public class **{ String name: ...

  3. 腾讯AlloyTeam发布AlloyLever - 开发调试发布错误监控上报用户问题定位尽在1kb代码

    AlloyLever [官网][Giuhub] 1kb(gzip)代码搞定开发调试发布,错误监控上报,用户问题定位. 支持错误监控和上报 支持 vConsole错误展示 支持开发阶段使用 vConso ...

  4. 构建工具Gulp

    前面的话 与grunt类似,gulp也是构建工具,但相比于grunt的频繁IO操作,gulp的流操作能更快更便捷地完成构建工作.gulp借鉴了Unix操作系统的管道(pipe)思想,前一级的输出,直接 ...

  5. JavaScript设计模式_05_发布订阅模式

    发布-订阅模式,定义了对象间的一种一对多的依赖关系,当一个对象的状态发生变化时,所有依赖它的对象都将得到通知.发布-订阅模式是使用比较广泛的一种模式,尤其是在异步编程中. /* * pre:发布-订阅 ...

  6. [codeforces631E]Product Sum

    E. Product Sum time limit per test: 1 second memory limit per test: 256 megabytes input:standard inp ...

  7. 搭建vue开发环境及各种报错处理

    1.安装node.js 参考教程:http://nodejs.cn/download/ 我的是windows 64位系统,以此为例: (1)打开 http://nodejs.cn/download/ ...

  8. 我们为什么要使用AOP?

    原文地址http://www.cnblogs.com/xrq730/p/7003082.html,转载请注明出处,谢谢 前言 一年半前写了一篇文章Spring3:AOP,是当时学习如何使用Spring ...

  9. js实现htmlToWordDemo

    之前由于工作需要,需要实现将html内的一部分内容直接转为word和pdf的功能.就研究了一下方法并且实现了两个demo.今天先说一下html to word(才疏学浅,仅供交流,如有错误,请指出). ...

  10. Python 内置函数汇总

    循环设计与循环对象 range() enumerate() zip() iter() 函数对象 map() filter() reduce() 序列操作 all([True, 1, "hel ...