说明
基于上篇文章做,数据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();
});
}