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 ...
随机推荐
- Yii2中限制访问某控制器的IP(IP白名单)
有关Yii2.0鉴权之访问控制过滤器参考这篇文章 http://www.yiiframework.com/doc-2.0/guide-security-authorization.html 这里主要 ...
- Caffe代码分析--crop_layer.cu
因为要修改Caffe crop layer GPU部分的代码,现将自己对这部分GPU代码的理解总结一下,请大家多多指教! crop layer完成的功能(以matlab的方式表示):A(N,C,H,W ...
- Java 9 揭秘(3. 创建你的第一个模块)
文 by / 林本托 Tips 做一个终身学习的人. 在这个章节中,主要介绍以下内容: 如何编写模块化的Java程序 如何编译模块化程序 如何将模块的项目打包成模块化的JAR文件 如何运行模块化程序 ...
- CentOS 7 for ARM 安装一键Lnmp失败
背景 前面把树莓派装上了CentOS 7,趁着国庆放假回来赶紧把服务端环境搭起来,为了方便就准备用一键lnmp快速部署一个,结果死活安装不成功... 报错 按照以往的经验进行安装,在我的小树莓派上安装 ...
- android6.0搜索蓝牙无法显示问题解决
1.android6.0版本搜索蓝牙需要开启位置信息 需在Manifest中添加权限: <uses-permission android:name="android.permissio ...
- Ubuntu发行版升级
从UK 13.10升级到UK 14.10 方法一: 1.sudo apt-get update 2.sudo update-manager -c -d 3.选择upgrade(升级) 方法二 ...
- ionic 中关于日期的转换格式
//在HTML页面上{{ 2015-12-07T15:59:59.000Z | date }} //结果:December 7, 2015 {{ 2015-12-07T15:59:59.000Z | ...
- Linux系统下源码安装rz/sz命令
背景:在windows环境下,使用xshell远程连接公司内部做的一个类似centos的系统,但该linux系统yum install有问题,只能源码安装. root 账号登陆后,依次执行以下命令: ...
- 并发编程(三):全视角解析volatile
一.目录 1.引入话题-发散思考 2.volatile深度解析 3.解决volatile原子性问题 4.volatile应用场景 二.引入话题-发散思考 public class T1 { /*vol ...
- SICP-2.2-数据的抽象
数据的抽象 生活中有许多的事物具有复合结构,例如地理位置所用的经纬度,便是通过一个复合结构来代表位置,在我们的程序当中,我们设法将经度纬度组合成一对,我们既可以把他们当做一个整体单元来进行操作,而且也 ...