echarts实现双轴、自定义分组、支持dataZoom

<template>
  <div class="container">
    <Button type="primary" class="btn" @click="refresh">重置/刷新</Button>
    <div class="echartsClass" :style="{height:isShowTable ? '400px' : '750px'}">
      <div id="main" style="width: 100%;height:100%;"></div>
    </div>

    <div class="tableClass" v-if="isShowTable">
      <el-table border :data="tableData" style="width: 100%">
        <el-table-column prop="date" label="日期" align="center"></el-table-column>
        <el-table-column prop="name" label="姓名" width="220" align="center"></el-table-column>
        <el-table-column prop="address" label="地址" align="center"></el-table-column>
        <el-table-column prop="job" label="工作" width="220" align="center"></el-table-column>
        <el-table-column prop="isMarried" label="婚否" align="center"></el-table-column>
        <el-table-column prop="time" label="通勤时间" align="center"></el-table-column>
      </el-table>
    </div>
  </div>
</template>

<script>
import * as echarts from 'echarts';
export default {
  name: "index",
  data() {
    return {
      myCharts: "",
      xAxisData:  [
          "君越","君威","GL8","昂科威","汉DMI","宋DMI","海豹DMI","秦L","雅阁","思域","帕萨特","迈腾","速腾","亚洲龙","凯美瑞",
          "宝马5系","艾瑞泽8","风云a8","瑞虎","奥迪A4L","奥迪A6L",
      ],
      xAxisGroupData: [
        "","{offset|}别克","","","","{offset|}比亚迪","","","{offset|}本田","","","大众","","{offset|}丰田","",
        "宝马","","奇瑞","","{offset|}奥迪","",
      ], // 分组显示的标签(组内如果是偶数加上偏移{offset|},如果是计数放正中间,写的时候先照抄上面的轴数据,相同的置空,位置不居中的的加上{offset|}(靠前的位置加)

      xAxisGroupData2: [
        "{offset|}一月","","{offset|}二月","","{offset|}三月","","{offset|}四月","{offset|}{offset|}五月","","六月","{offset|}七月","{offset|}{offset|}八月","","{offset|}九月","",
        "十月","","十一月","","{offset|}十二月","",
      ], // 分组显示的标签(组内如果是偶数加上偏移{offset|},如果是计数放正中间,写的时候先照抄上面的轴数据,相同的置空,位置不居中的的加上{offset|}(靠前的位置加)
      seriesData:  [
          100, 120, 110, 130, 150, 90, 100, 120, 110, 130, 150, 90, 100, 120, 110, 130, 150, 90,
          100, 120, 110, 130, 150, 90, 100, 120, 110, 130, 150, 90, 100, 120, 110, 130],
      seriesData2:  [
          245, 550, 228, 336, 169, 320, 222, 398, 300, 233, 367, 170, 288, 173, 213, 321, 290, 279,
          168, 269, 369, 185, 159, 190, 433, 396, 274, 420, 257, 145, 200, 190, 189, 330],
      groupSeparates: [true, false, false, false, true, false, false, false, true, false, true, false, false, true,
        false, true, true, false, false, true, ], // 分组分隔线,长竖线是true,短竖线是false
      tableData: [
        {date: '2016-05-02', name: '王小虎', address: '上海市普陀区金沙江路 1518 弄',job:'teacher',isMarried:"true",time:'1小时'},
        {date: '2016-05-04', name: '王小虎', address: '上海市普陀区金沙江路 1517 弄',job:'doctor',isMarried:'true',time:'1.5小时'},
        {date: '2016-05-01', name: '王小虎', address: '上海市普陀区金沙江路 1519 弄',job:'salespeople',isMarried:'true',time:'1.5小时'},
        {date: '2016-05-03', name: '王小虎', address: '上海市普陀区金沙江路 1516 弄',job:'lawyer',isMarried:'false',time:'2小时'}
      ],
      isShowTable:false,
    }
  },
  mounted() {
    this.initEcharts();
  },
  methods: {
    initEcharts() {
      this.myCharts = echarts.init(document.getElementById('main'));

      // 指定图表的配置项和数据
      let option = {
        title : { text : 'echarts自定义分组-静态' },
        grid:{  // 设置图表的边距,需要留白的大小
          left: "5%",
          top: "15%",
          right: "5%",
          bottom: "25%",
        },
        dataZoom: {type : 'inside'},
        // dataZoom: [ // 有的版本需要单独给每个x轴设置缩放,不然第二个轴不会跟着缩放,看echarts版本吧
        //     {type : 'inside',xAxisIndex: 0},
        //     {type : 'inside',xAxisIndex: 1},
        //     {type : 'inside',xAxisIndex: 2},
        // ],
        // dataZoom: [ // 这是默认展示的缩放大小,可以解决数据过多时柱状图挤在一起的状况
        //     {type: 'inside',xAxisIndex: [0,1,2], start: 0, end: 35},
        // ],
        tooltip : {},
        legend:{},
        xAxis : [
          {
            xAxisIndex: 0,
            position : "bottom",
            data : this.xAxisData,
            axisTick : {
              length : 20 // 刻度线的长度
            },
            axisLabel : {
              margin : 20 // 标签到轴线的距离
            }
          },
          {
            xAxisIndex: 1,
            position : "bottom",
            data : this.xAxisGroupData,
            axisTick : {
              length : 60,
              interval : (index, value)=> { // // 这里如果是普通的function定义的话,注意this的问题,需要that = this 或者箭头函数
                return this.groupSeparates[index]; // 根据标识分组的刻度线
              }
            },
            axisLabel : {
              margin : 50,
              interval : 0, // 显示所有标签
            }
          },
          {
            xAxisIndex: 2,
            position : "bottom",
            data : this.xAxisGroupData2,
            axisTick : {
              length : 30,
              interval : (index, value)=> { // // 这里如果是普通的function定义的话,注意this的问题,需要that = this 或者箭头函数
                return this.groupSeparates[index]; // 根据标识分组的刻度线
              }
            },
            axisLabel : {
              margin : 75,
              interval : 0, // 显示所有标签
            }
          },
        ],
        yAxis : {},
        series : [
          {
            type : 'bar',
            name:'国内汽车销量',
            data : this.seriesData
          },
          {
            type : 'bar',
            name:'全球汽车销量',
            data : this.seriesData2
          },
        ]
      };
      console.log(this.myCharts);

      this.myCharts.lastBandWidth = 0;
      // 监听渲染事件,只要bandWidth发生变化,重新设置标签偏移的值
      this.myCharts.on('rendered', this.renderedHandel);

      this.myCharts.on('click', this.clickHandle);

      // 绘制
      this.myCharts.setOption(option);
    },

    // 鼠标缩放后,重新设置标签偏移的值
    renderedHandel() {
      // ()=> {   // 这里如果是普通的function定义的话,注意this的问题,需要that = this 或者箭头函数
        this.$nextTick(()=>{
          let bandWidth = this.myCharts._chartsViews[0].renderTask.context.outputData._layout.bandWidth;
          if (this.myCharts.lastBandWidth != bandWidth) {
            this.myCharts.lastBandWidth = bandWidth;
            // 延时执行否则echarts渲染异常
            setTimeout(()=>{
              // 加上偏移后重新绘制
              let optionNew = {xAxis: [{},{},{}]};    // 有几个X轴就有几个{}
              // 增量更新偏移值,有几个X轴就有几个optionNew.xAxis[n]
              optionNew.xAxis[1] = {axisLabel:{rich:{offset:{width: this.myCharts.lastBandWidth}}}};
              optionNew.xAxis[2] = {axisLabel:{rich:{offset:{width: this.myCharts.lastBandWidth}}}};
              //console.info(optionNew);
              this.myCharts.setOption(optionNew);
            }, 0);
          }
        });
      // }
    },

    // 鼠标点击柱状图
    clickHandle(params) {
      console.log(params);
      this.isShowTable = true;
      this.$nextTick(()=>{    // 在执行这个钩子之前,vue会先看下(检测)页面有咩有改动,如果页面改动了就等页面重新渲染完成后,再执行这个钩子中的代码 确保echarts已经渲染完毕
        this.myCharts.resize();
      });
      this.$notify({
        // title: this.$createElement('span',{style:{color:'#67C23A'}},`获取${params.name}数据成功`),
        title: `获取${params.name}数据成功`,
        dangerouslyUseHTMLString: true, // 确保启用这个选项以允许HTML
        message: `<div>国内销量:xxx台</div> <div>全球销量:xxx台</div>`,
      });
    },
    // 刷新
    refresh() {
      this.isShowTable = false;
      this.$nextTick(()=>{    // 在执行这个钩子之前,vue会先看下(检测)页面有咩有改动,如果页面改动了就等页面重新渲染完成后,再执行这个钩子中的代码 确保echarts已经渲染完毕
        this.myCharts.resize();
      });
    }
  }
}
</script>

<style scoped>
.container {
  padding: 20px;
}
.btn {
  width: 120px;
}
.echartsClass {
  width: 100%;
  height: 400px;
  margin-top: 30px;
}
.tableClass {
  margin-top: 50px;
}
</style>
GIF 2024-9-25 21-41-42.gif

参考博客:
https://blog.csdn.net/chch87/article/details/123877652
https://blog.csdn.net/smallNut/article/details/122194634

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,053评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,527评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,779评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,685评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,699评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,609评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,989评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,654评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,890评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,634评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,716评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,394评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,976评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,950评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,191评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,849评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,458评论 2 342

推荐阅读更多精彩内容