让崩塌的echarts图像变得好看

136 阅读3分钟

让崩塌的echarts图像变得好看 image.png

主要是改变了传入series的数据

var actualHeight = [
    [['2023-04-02',143],['2023-04-07',136],['2023-04-08',139],['2023-04-11',141],['2023-04-12',149],['2023-04-14',150]],
    [['2023-04-04',351],['2023-04-07',325],['2023-04-08',327],['2023-04-09',318],['2023-04-12',314]],
    [['2023-04-01',214],['2023-04-02',221],['2023-04-03',244],['2023-04-04',271],['2023-04-05',264],['2023-04-08',283],['2023-04-09',281],['2023-04-10',266],['2023-04-11',264],['2023-04-12',269],['2023-04-13',285],['2023-04-15',290]],
    
]
var a = ['2023-04-01','2023-04-02','2023-04-03','2023-04-04','2023-04-05','2023-04-06','2023-04-07','2023-04-08','2023-04-09','2023-04-10','2023-04-11','2023-04-12','2023-04-13','2023-04-14','2023-04-15']
var nName = ['香蕉', '牛奶', '蜜桃']
// var iName = 0
/**
 * 获取两个日期之间的所有日期
 */
var tQuantum = []; // 给日期创建容器
Date.prototype.format = function() {
  var s = '';
  var mouth = (this.getMonth() + 1)>=10?(this.getMonth() + 1):('0'+(this.getMonth() + 1));
  var day = this.getDate()>=10?this.getDate():('0'+this.getDate());
  s += this.getFullYear() + '-'; // 获取年份。
  s += mouth + "-"; // 获取月份。
  s += day; // 获取日。
  return (s); // 返回日期。
};

function getAll(start, end) {
  var ab = start.split("-");
  var ae = end.split("-");
  var db = new Date();
  db.setUTCFullYear(ab[0], ab[1] - 1, ab[2]);
  var de = new Date();
  de.setUTCFullYear(ae[0], ae[1] - 1, ae[2]);
  var unixDb = db.getTime();
  var unixDe = de.getTime();
  for (var k = unixDb; k <= unixDe;) { 
    var nDate = (new Date(parseInt(k))).format()
    // 把日期传入准备好的容器中
    tQuantum.push(nDate);      
    k = k + 24 * 60 * 60 * 1000;
  }
}

// 把时间戳转换为日期格式
function getdateNoTime(date) {
  var now = new Date(date),
    y = now.getFullYear(),
    m = now.getMonth() + 1,
    d = now.getDate();
  return y + '-' + (m < 10 ? '0' + m : m) + '-' + (d < 10 ? '0' + d : d);
}

var chartData = [] // 给echarts数据准备的容器
// 补全一段数组
for(var u = 0; u < actualHeight.length; u++) {
    var start = actualHeight[u][0][0]
    var end = actualHeight[u][actualHeight[u].length-1][0]
    tQuantum = [] // 避免产生重复值
    getAll(start, end) // 产生完整日期数组
    var b = [] // 残缺日期的数组
    actualHeight[u].forEach(function(iItem) {
      b.push(iItem[0])
    })    
    // 补上空缺日期,并设置日期为0
    for(let i = 0; i < tQuantum.length; i++) {
      if(tQuantum[i] !== b[i]) {
        b.splice(i,0,tQuantum[i])
        actualHeight[u].splice(i,0,[tQuantum[i], 0])
      }
    }
    // 补上数据为0的数据
    for(var i = 0; i < actualHeight[u].length; i++) {
        for(let j = i+1; j < actualHeight[u].length; j++){
            if(actualHeight[u][j][1] !== 0 && actualHeight[u][i][1] == 0) {
                actualHeight[u][i][1] = actualHeight[u][j][1]
            }
        }
        for(let k = actualHeight[u].length-1; k > 1; k--){
            // console.log(a[k][1]);
            if(actualHeight[u][k][1] !== 0 && actualHeight[u][i][1] == 0) {
                actualHeight[u][i][1] = actualHeight[u][k][1]
            }
        }
    }
    // console.log(actualHeight);
    
}
// 设置显示格式
/**
 * 思路(瞎编个思路【狗头🐶】):
 * 1. 如果下层没有数据就补下层每层第一个数据
 * 2. 如果上层没数据下层有数据就补上层最后一个数据
*/
// 真正的实现过程
// 从上往下检测
for(var u = actualHeight.length-1; u >= 0; u--) {
  // 从前往后,检测所有下层比这一层日期大就加上大的这层数据
  for(var j = 0; j < actualHeight[u].length; j++) {
    for(var k = 1; k <= u; k++) {
      if(actualHeight[u-k] !== undefined) {
        if(actualHeight[u-k][0][0] > actualHeight[u][j][0]) {
          actualHeight[u][j][1] += actualHeight[u-k][0][1];
        } else {
          break
        }
      }      
    }
  }
}

// 后面的
for(var u = 0; u < actualHeight.length; u++) {
  // 补上相对于下层,上层后边缺失的日期
  if(actualHeight[u+1] !== undefined && actualHeight[u][actualHeight[u].length-1][0] > actualHeight[u+1][actualHeight[u+1].length-1][0]) {
    var  dStart = Date.parse(actualHeight[u+1][actualHeight[u+1].length-1][0]);
    var  dEnd = Date.parse(actualHeight[u][actualHeight[u].length-1][0]);
    var days = (dEnd - dStart)/(1*24*60*60*1000);
    var tStamp = new Date(actualHeight[u+1][actualHeight[u+1].length-1][0])
    
    for(var j = 0; j < days; j++) {
      tStamp = tStamp.setDate(tStamp.getDate()+1);
      tStamp = new Date(tStamp);
      console.log(tStamp);
      actualHeight[u+1].push([getdateNoTime(tStamp), actualHeight[u+1][actualHeight[u+1].length-1][1]])
    }  
  }
}

for(var u = actualHeight.length-1; u >= 0; u--) {
  // 基于执行顺序,不能和上面代码合并
  // 从后往前,检测所有下层比这一层日期小就加上小的这层数据
  for(var j = actualHeight[u].length-1; j >= 0; j--) {
    for(var k = 1; k <= u; k++) {
      if(actualHeight[u-k] !== undefined) {
        if(actualHeight[u][j][0] > actualHeight[u-k][actualHeight[u-k].length-1][0]) {
          actualHeight[u][j][1] += actualHeight[u-k][actualHeight[u-k].length-1][1]
        } else {
          break
        }
      }
    }
  }  
}
console.log(actualHeight);

// 传进echarts图表
for(var u = 0; u < actualHeight.length; u++) {
  chartData.push({
    name: nName[u],
    type: 'line',
    stack: 'Total',
    smooth: 0,
    showSymbol: true,
    areaStyle: {},
    emphasis: {
        focus: 'series'
    },
    data: actualHeight[u]
  })  
}

var chartDom = document.getElementById('main');
var myChart = echarts.init(chartDom);
var option;

option = {
  title: {
    text: 'Stacked Area Chart'
  },
  tooltip: {
    trigger: 'axis',
    axisPointer: {
      type: 'cross',
      label: {
        backgroundColor: '#6a7985'
      }
    }
  },
  legend: {
    data: ['0', '1', '2']
  },
  toolbox: {
    feature: {
      saveAsImage: {}
    }
  },
  grid: {
    left: '3%',
    right: '4%',
    bottom: '3%',
    containLabel: true
  },
  xAxis: [
    {
      type: 'category',
      boundaryGap: false,
      data: a
    }
  ],
  yAxis: [
    {
      type: 'value'
    }
  ],
  series: chartData
};
option && myChart.setOption(option);

成品图如下:

image.png