截断思路-柱状图差值特别大的y轴刻度展示

描述:当前是关于Echarts图表中的 柱状图 示例。
 
            // 绿色轴刻度关联高亮的柱子(值大的 )
// 如果最大和最小差别特别大  最大2000 最小100 那么最小的就看不到了
// 这里的红色关联低亮的柱子(值小的)

// 最好的方式就是双y轴左右分开颜色以及其他设计标注
// 这个最好用于差值比例特别大的
let data = [
  {
    date: '2012',
    name: '各年度xxx',
    value: 1065
  },
  {
    date: '2013',
    name: '各年度xxx',
    value: 1054
  },
  {
    date: '2014',
    name: '各年度xxx',
    value: 1956
  },
  {
    date: '2015',
    name: '各年度xxx',
    value: 755
  },
  {
    date: '2016',
    name: '各年度xxx',
    value: 300
  },
  {
    date: '2017',
    name: '各年度xxx',
    value: 163
  },
  {
    date: '2018',
    name: '各年度xxx',
    value: 220
  },
]
// 界定最小开始截断的数据
let truncationValue = 300;
// 用于修改截断样式的
let truncationValueFirstLens = [];
data.map((v, k) => {
  if (v.value <= truncationValue) {
    truncationValueFirstLens.push(k)
  }
})
// 用于截断样式的数据
let truncationData = new Array(data.length).fill(truncationValue, 0);

// 处理数值大的(大于界定值的)
const highDataFun = (d, min) => {
  let resData = d.map((v) => {
    if (v.value <= min) return 0;
    else return v.value
  })
  return resData;
}
let highData = highDataFun(data, truncationValue);


// 数据数值小的(小于界定值的)
let minDataFun = (d, min) => {
  let resData = d.map((v) => {
    if (v.value > min) {
      return 0;
    } else {
      return v.value;
    }
  })
  return resData;
}
/**
 * 传入一个数组 和 截断临界值;吧大于临界值的设置为0 小于的则正常*/ 
let minData = minDataFun(data, truncationValue);

// 获取最大值的方法
let dataMaxFun = (d) => {
  return d.filter((v) => v && v > 0).sort((a, b) => b - a)[0];
}
// 获取数组最小值的方法
let dataMinFun = d => {
  return d.filter((v) => v && v > 0).sort((a, b) => a - b)[0];
}
// 数值大的数据中最大值
let highDataMax = dataMaxFun(highData);
// 数值大的数据中最小值
let highDataMin = dataMinFun(highData);
// 数值小的数据中最大值
let minDataMax = dataMaxFun(minData);
// 这里以数值小的最大值作为 数值大的刻度最大分割;并且计算会出现多少刻度
let Yscale = Math.ceil(highDataMax / minDataMax);

// 大的数据最大刻度
let maxDataMax = Math.trunc(highDataMin / Yscale)
option = {
  backgroundColor: '#fff',
  tooltip: {
    trigger: 'axis',
    backgroundColor: '#081429',
    textStyle: {
      color: '#fff',
    },
    borderColor: "rgba(255,100,100,1)",
    axisPointer: {
      z: 111,
      lineStyle: {
        color: "rgba(255,100,100,1)"
      },
    },
  },
  legend: {
    data: ['Forest']
  },
  xAxis: [
    {
      type: 'category',
      axisTick: { show: false },
      data: ['2012', '2013', '2014', '2015', '2016', '2017', '2018']
    }
  ],
  yAxis: [
    {
      type: 'value',
      max: highDataMin,    // 高数据的中的最小
      maxInterval: maxDataMax,   //最大轴线分割
      axisLabel: {
        show: true,
        color: 'red',
        formatter: (v) => {
          if (v >= minDataMax + maxDataMax) {
            return ''
          } else {
            return v;
          }
        }
      },
      axisLine: {
        show: false
      },
      splitLine: {
        show: false
      }
    },
    {
      type: 'value',
      position: 'left',
      maxInterval: minDataMax,   //最大轴线分割
      axisLabel: {
        color: 'green',
        formatter: (v) => {
          // 咋算的忘了;就是这个么写法
          if (v <= Yscale * minDataMax / highDataMin * minDataMax + maxDataMax * 2) {
            return ''
          } else {
            return v;
          }
        }
      }
    }
  ],
  color: ['#5aabff', '#fc8452', '#ea7ccc'],
  series: [
    {     //正常的数据
      name: 'Forest',
      type: 'bar',
      barGap: '-100%',
      barWidth: 20,
      yAxisIndex: 1,      //关联y轴1
      data: highData
    },
    {       //数值小的
      name: 'Forest',
      type: 'bar',
      barGap: '-100%',
      barWidth: 20,
      xAxisIndex: 0,    //关联y轴0 下标
      data: minData,
      label: {
        show: true,
        position: 'top',
        formatter: (v) => {
          if (v.data) { return v.data }
          else return ''
        }
      },
      itemStyle: {
        opacity: 0.5
      }
    },
    {       //截断样式的
      type: 'bar',
      data: truncationData,
      showSymbol: false,
      yAxisIndex: 0,
      itemStyle: {
        color: "rgba(255,255,255,0)"
      },
      z: 10,   //看文档改为z;zlevel会新创建canvas绘制不在一个2d内;且toopit高于此
      label: {
        show: true,
        distance: 10,
        position: 'top',
        rotate: -30,
        formatter: (v) => {
          // 数据小的截断不需要
          if (truncationValueFirstLens.includes(v.dataIndex)) {
            return ``
          } else {
            return `{a|}`
          }
        },
        rich: {
          a: {
            width: 35,
            height: 10,
            backgroundColor: 'white',
          }
        }
      },
      barGap: '-100%',
      barWidth: 20,
      markLine: {
        silent: false,
      },
      tooltip: {
        show: false,
      },
      select: {
        disabled: true
      },
      emphasis: {
        disabled: true
      }
    }
  ]
};