echarts 实现x轴label倒序动态计算间隔显示

问题:有一个需求:就是需要保证x轴显示最新一条数据(也就是最后一条数据),前面的数据自动均匀间隔显示
解决:通过动态设置xAxis轴的axisLabel中的interval回调函数返回显示的值,实现永远显示最后一个数据,并保证间隔均匀显示其他值

<template>  
<div class="home_box">
    <div id="main" style="width:500px;height:300px"></div>
  </div>
</template>
<script setup>
import * as echarts from 'echarts';
import {onMounted,onDeactivated,computed} from 'vue'
const getFormatter=(value,index)=>{
  if(index%4==2){
    return value
  }
}
const getOption = (yData,startLength,time)=>{
  let interval = Math.ceil(startLength/6)
  return {
  tooltip: {
    trigger: 'axis',
    position: function (pt) {
      return [pt[0], '10%'];
    }
  },
  title: {
    left: 'center',
    text: 'Large Ara Chart'
  },
  toolbox: {
    feature: {
      dataZoom: {
        yAxisIndex: 'none'
      },
      restore: {},
      saveAsImage: {}
    }
  },
  xAxis: {
    type: 'category',
    boundaryGap: false,
    axisLabel: {
      fontSize:12,
      hideOverlap: true,
      interval:(index,value)=>{
        if((index%interval)==((time.length-1)%interval)){
          return value
        }else{
          return ''
        }
      },
      showMaxLabel:true,
    },
    data:time
  },
  yAxis: {
    type: 'value',
    boundaryGap: [0, '100%']
  },
  grid: {
    right:100
  },
  dataZoom: [
    {
      type:'slider',
      start: (yData.length-startLength)/yData.length*100,
      end: 100,
    }
  ],
  series: [
    {
      name: 'Fake Data',
      type: 'line',
      smooth: true,
      symbol: 'none',
      areaStyle: {},
      data: yData
    }
  ]
};
}
onMounted(()=>{
  let chartDom = document.getElementById('main');
  let myChart = echarts.init(chartDom);
  let times = [
    "1952年",
    "1953年",
    "1954年",
    "1955年",
    "1956年",
    "1957年",
    "1958年",
    "1959年",
    "1960年",
    "1961年",
    "1962年",
    "1963年",
    "1964年",
    "1965年",
    "1966年",
    "1967年",
    "1968年",
    "1969年",
    "1970年",
    "1971年",
    "1972年",
    "1973年",
    "1974年",
    "1975年",
    "1976年",
    "1977年",
    "1978年",
    "1979年",
    "1980年",
    "1981年",
    "1982年",
    "1983年",
    "1984年",
    "1985年",
    "1986年",
    "1987年",
    "1988年",
    "1989年",
    "1990年",
    "1991年",
    "1992年",
    "1993年",
    "1994年",
    "1995年",
    "1996年",
    "1997年",
    "1998年",
    "1999年",
    "2000年",
    "2001年",
    "2002年",
    "2003年",
    "2004年",
    "2005年",
    "2006年",
    "2007年",
    "2008年",
    "2009年",
    "2010年",
    "2011年",
    "2012年",
    "2013年",
    "2014年",
    "2015年",
    "2016年",
    "2017年",
    "2018年",
    "2019年",
    "2020年",
    "2021年",
    "2022年"
]
  let yData = [
    "679.1",
    "824.4",
    "859.8",
    "911.6",
    "1030.7",
    "1071.4",
    "1312.3",
    "1447.5",
    "1470.1",
    "1232.3",
    "1162.2",
    "1248.3",
    "1469.9",
    "1734",
    "1888.7",
    "1794.2",
    "1744.1",
    "1962.2",
    "2279.7",
    "2456.9",
    "2552.4",
    "2756.2",
    "2827.7",
    "3039.5",
    "2988.6",
    "3250",
    "3678.7",
    "4100.5",
    "4587.6",
    "4935.8",
    "5373.4",
    "6020.9",
    "7278.5",
    "9098.9",
    "10376.2",
    "12174.6",
    "15180.4",
    "17179.7",
    "18872.9",
    "22005.6",
    "27194.5",
    "35673.2",
    "48637.5",
    "61339.9",
    "71813.6",
    "79715",
    "85195.5",
    "90564.4",
    "100280.1",
    "110863.1",
    "121717.4",
    "137422",
    "161840.2",
    "187318.9",
    "219438.5",
    "270092.3",
    "319244.6",
    "348517.7",
    "412119.3",
    "487940.2",
    "538580",
    "592963.2",
    "643563.1",
    "688858.2",
    "746395.1",
    "832035.9",
    "919281.1",
    "986515.2",
    "1013567",
    "1143669.7",
    "1210207"
]
option = getOption(yData,startLength,time)

option && myChart.setOption(option);
myChart.on('dataZoom',function(event){
    let startLength = (event.end-event.start)/100*time.length;
    let interval = Math.ceil(startLength/6)
    console.log(startLength,interval)
    option.xAxis.axisLabel.interval=(index,value)=>{
        if((index%interval)==((time.length-1)%interval)){
          return value
        }else{
          return ''
        }
      },
      option.dataZoom[0].start = (yData.length-startLength)/yData.length*100;
      option.dataZoom[0].end = event.end
      console.log(option)
    myChart.setOption(option)
  })
})
<style lang="scss" scoped>
.home_box {
  display: flex;
  align-content: space-between;
  text-align: center;
  width:500px;
  height:300px;
  // height: 100%;
}
</style>

初始状态
缩放后显示

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值