说明
基于上篇文章做,数据data顺序要一一对应。关键部分的代码判断比较麻烦,如哪位大神有更好的办法,请指教,谢谢!
示例图
css代码
.boder {border: solid 1px #c5c5c5;}.eDiv {width: calc(50% - 2px);height: 350px;float: left;}
HTML代码
<div class="eDiv boder" id="Q1"></div>
JS代码
<script src="js/jquery-1.6.2.min.js"></script><script src="js/echarts.min.js"></script>$(function () {//三折线图标注文字上下自动排序var Q9data={title:"三折线图标注文字上下自动排序",tip:"累计同比:+1.0%",color:["B1","B2","B3"],x:['1月','2月','3月','4月','5月','6月','7月','8月','9月','10月','11月','12月'],y:[{min:null,max:null,name:"(单位:亿元)",unit:"圆"}],data:[{name:"本年累计",yAxisIndex:0,type:"line",data:["21","3","38","9","3","5","35","25","14","11","9","25"]},{name:"去年累计",yAxisIndex:0,type:"line",data:["13","9.3","9","17","8.5","11.5","9.3","9","17","8.5","27.5","23.666"]},{name:"本年预测值",yAxisIndex:0,type:"line",data:["25","25","25","25","25","25","25","25","25","25","25","25"]}]};/*** @var {object}* @desc 前端重定义echar画图细节和区别* @property {number} left - 图形备注上离左边多少距离(单位为%)* @property {number} top - 图形备注上离顶部多少距离(单位为%)* @property {string} unit - Y轴刻度上的单位* @property {number} tofiexd - Y轴刻度上保留多少位小数* @property {boolean} tipUnit - true|强制使用tip的unit;false|不使用tip的unit**/var tip={left:11,top:20,tofiexd:1,unit:"%",tipUnit:true,}drawThreeLine("Q9","line_auto_up_down",Q9data,tip);var t = setInterval(function(){var d1=[],d2=[],d3=[];for(let i = 0 ; i<10;i++){var val1 = fRandomBy(10,40).toString();d1.push(val1);}for(let i = 0 ; i<12;i++){var val2 = fRandomBy(20,40).toString();var val3 = "25";d2.push(val2);d3.push(val3);tip.left=fRandomBy(10,20);tip.top=fRandomBy(20,70);}Q9data.data[0].data=d1;Q9data.data[1].data=d2;Q9data.data[2].data=d3;drawThreeLine("Q9","line_auto_up_down",Q9data,tip)},3000);});/*** @func* @desc 三折线标注文字位置自动排序* @param {string} id - string |目标id* @param {string} type - string | line_auto_up_down(三条折线,并且排列标记字的位置* @param {object} data - 后端数据 @returns {...}* @param {object} tip - 前端重定义echar画图细节和区别 @returns {...}**/function drawThreeLine(id,type,data,tip){var myChart = echarts.init(document.getElementById(id));var option = {title: {text: "默认标题",x: 'center',top: '5'},tooltip: {trigger:'axis',confine: true,axisPointer:{type:"line"}},legend:{show:true,bottom: 15,},xAxis: {type: 'category',data: ['周一','周二','周三','周四','周五','周六','周日']},yAxis: [{type: 'value',show: true,min: null,max: null,name:"(单位:xx)",splitLine:{show:false}},{type: 'value',show: false,min: null,max: null,name:"(单位:xx)",splitLine:{show:false}},],grid: {left: '4%',right: '4%',bottom: '15%',top:"20%",containLabel: true},series: []}//全局处理var sunit = "",stofixed = 0;//前端控制设置if(tip){if(tip.tofiexd){stofixed = tip.tofiexd}if(tip.unit){sunit = tip.unit}}//后端传数据源if(data){if(data.title){option.title.text = data.title;}if(data.color){var arrColor=["blue","red","green"];option.color = arrColor;}if(data.x){option.xAxis.data = data.x;}for(var mm=0;mm<data.y.length;mm++){if( data.y[mm].name){option.yAxis[mm].name = data.y[mm].name;}if( data.y[mm].min){option.yAxis[mm].min = data.y[mm].min;}if( data.y[mm].max){option.yAxis[mm].max = data.y[mm].max;}if(tip){if(tip.tipUnit){sunit=tip.unit}else{if( data.y[mm].unit){sunit=data.y[mm].unit}}}option.yAxis[mm].axisLabel={formatter: function(val){if(stofixed == 0){return val + sunit;}else{return val.toFixed(stofixed) + sunit;}}}}if(data.y.length > 1){option.yAxis[1].show = true;var _sunit=[];for(var kk=0;kk<data.y.length;kk++){if( data.y[kk].unit){var uit={unit:data.y[kk].unit}_sunit.push(uit);}}if(_sunit.length>1){option.yAxis[0].axisLabel={formatter: function(val){if(stofixed == 0){return val + _sunit[0].unit;}else{return val.toFixed(stofixed) + _sunit[0].unit;}}}option.yAxis[1].axisLabel={formatter: function(val){if(stofixed == 0){return val + _sunit[1].unit;}else{return val.toFixed(stofixed) + _sunit[1].unit;}}}}}}//line_auto_up_down类型处理if(type=="line_auto_up_down"){var arrVal1=[],arrVal2=[];for(var i=0;i<data.data.length;i++){var val=data.data[i];var tmp={name:val.name,type:val.type,yAxisIndex:val.yAxisIndex,data:[]}for(var j=0;j<val.data.length;j++){var vval={value:val.data[j]};tmp.data.push(vval)}option.series.push(tmp)}for(var j=0;j<data.data[0].data.length;j++){arrVal1.push(data.data[0].data[j])arrVal2.push(data.data[1].data[j])}//预测数据长度var lastLength = data.data[2].data.length;//本年最后月数据(长度以本年为基准)var val0 = option.series[0].data[arrVal2.length-1].value;//去年最后月数据(长度以本年为基准)var val1 = option.series[1].data[arrVal2.length-1].value;//去年最后月数据(长度以预测为基准)var val2 = option.series[1].data[lastLength-1].value;//预测最后月数据(长度以预测为基准)var val3 = option.series[2].data[lastLength-1].value;/* 2组数组长度相同,即本年全年每个月数据都齐了,要和去年每个月数据比较,但是只显示最后的数据处理方法 */if(arrVal1.length == arrVal2.length && arrVal2.length == lastLength){option.series[2].data[arrVal2.length-1].label={show:true,position:"right"};if(Number(val0)>Number(val1)){option.series[0].data[arrVal2.length-1].label={show:true,position:"top"};option.series[1].data[arrVal2.length-1].label={show:true,position:"bottom"};}else if(Number(val0) == Number(val1)){option.series[0].data[arrVal2.length-1].label={show:true,position:"top"};option.series[1].data[arrVal2.length-1].label={show:true,position:"bottom"};}else{option.series[0].data[arrVal2.length-1].label={show:true,position:"bottom"};option.series[1].data[arrVal2.length-1].label={show:true,position:"top"};}if(Number(val0) < Number(val3) && Number(val1)<Number(val3)){option.series[2].data[arrVal2.length-1].label={show:true,position:"top"};option.series[0].data[arrVal2.length-1].label={show:true,position:"right"};option.series[1].data[arrVal2.length-1].label={show:true,position:"right"};}if(Number(val0) == Number(val3) && Number(val1)==Number(val3)){option.series[0].data[arrVal2.length-1].label={show:true,position:"top"};option.series[1].data[arrVal2.length-1].label={show:true,position:"bottom"};}if(Number(val0) > Number(val3) && Number(val1)>Number(val3)){option.series[2].data[arrVal2.length-1].label={show:true,position:"bottom"};option.series[0].data[arrVal2.length-1].label={show:true,position:"right"};option.series[1].data[arrVal2.length-1].label={show:true,position:"right"};}}else{/* 本年有不齐每个月数据,即没有12月份的数据处理方法 */if(arrVal1.length==arrVal2.length){for(var i = 0; i <arrVal2.length; i++) {//本年和去年所有月份比较if(Number(arrVal1[i]) <= Number(arrVal2[i]) ) {option.series[0].data[i].label={show:false,position:"bottom"};option.series[1].data[i].label={show:false,position:"top"};}else{option.series[0].data[i].label={show:false,position:"top"};option.series[1].data[i].label={show:false,position:"bottom"};}//本年和去年最后月比较(以本年最后月为基准)if(Number(val0)>Number(val1)){option.series[0].data[arrVal2.length-1].label={show:true,position:"top"};option.series[1].data[arrVal2.length-1].label={show:true,position:"bottom"};}else if(Number(val0) == Number(val1)){option.series[0].data[arrVal2.length-1].label={show:true,position:"top"};option.series[1].data[arrVal2.length-1].label={show:true,position:"bottom"};}else{option.series[0].data[arrVal2.length-1].label={show:true,position:"bottom"};option.series[1].data[arrVal2.length-1].label={show:true,position:"top"};}//去年和预测最后月比较(预测最后月为基准)if(Number(val2) > Number(val3)){option.series[1].data[lastLength-1].label={show:true,position:"top"};option.series[2].data[lastLength-1].label={show:true,position:"bottom"};}else if(Number(val2) == Number(val3)) {option.series[1].data[lastLength-1].label={show:true,position:"bottom"};option.series[2].data[lastLength-1].label={show:true,position:"top"};}else{option.series[1].data[lastLength-1].label={show:true,position:"bottom"};option.series[2].data[lastLength-1].label={show:true,position:"top"};}/* */if(Number(val0) < Number(val3) && Number(val1)<Number(val3)){if(Number(val0)>Number(val1)){option.series[0].data[arrVal2.length-1].label={show:true,position:"top"};option.series[1].data[arrVal2.length-1].label={show:true,position:"bottom"};}else if(Number(val0) == Number(val1)){option.series[0].data[arrVal2.length-1].label={show:true,position:"top"};option.series[1].data[arrVal2.length-1].label={show:true,position:"bottom"};}else{option.series[0].data[arrVal2.length-1].label={show:true,position:"bottom"};option.series[1].data[arrVal2.length-1].label={show:true,position:"top"};}}if(Number(val0) == Number(val3) && Number(val1)==Number(val3)){option.series[0].data[arrVal2.length-1].label={show:true,position:"top"};option.series[1].data[arrVal2.length-1].label={show:true,position:"bottom"};}if(Number(val0) > Number(val3) && Number(val1)>Number(val3)){if(Number(val0)>Number(val1)){option.series[0].data[arrVal2.length-1].label={show:true,position:"top"};option.series[1].data[arrVal2.length-1].label={show:true,position:"bottom"};}else if(Number(val0) == Number(val1)){option.series[0].data[arrVal2.length-1].label={show:true,position:"top"};option.series[1].data[arrVal2.length-1].label={show:true,position:"bottom"};}else{option.series[0].data[arrVal2.length-1].label={show:true,position:"bottom"};option.series[1].data[arrVal2.length-1].label={show:true,position:"top"};}}/* */}}}/* 控制三条数据的层级 */option.series[0].zlevel=2;option.series[1].zlevel=1;option.series[2].zlevel=0;/* 备注显示隐藏*/if (data.tip !== null) {var left = '15%',top = '50%';/* 备注位置处理*/if (tip) {if (tip.left) {left = tip.left + "%";}if (tip.top) {top = tip.top + "%";}}var _html = "<div class='Tips' style='position: absolute;left: " + left + "; top: " + top + "; color:red;'>" + data.tip + "</div>";$('#' + id + " .Tips").remove();$(myChart._dom.childNodes[0]).after(_html);}else{$('#' + id + " .Tips").remove();}/* */}// 画图myChart.setOption(option,true);$(window).resize(function() {myChart.resize();});}
