Echarts—X轴鼠标滑动或者缩放/多列柱状图中某一列数据为0时不占位

这篇具有很好参考价值的文章主要介绍了Echarts—X轴鼠标滑动或者缩放/多列柱状图中某一列数据为0时不占位。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

需求背景

  1. 用柱状图展示12个月的项目对应的供应商数据;
  2. 每个月有多个项目不确定,1-50之间,也就是说,12个月,每个月的X轴上有不确定的柱状;例如:1月有20根柱子,2月有5根柱子,3月有15根…
  3. 每月的每根柱子代表是一个项目,鼠标移入每月的每一个项目的柱子上要悬浮展示该月该项目具体供应商的情况;

当时听了这个需求,我就很不解,这数据都是不确定的,咋展示,如果只展示一个月的数据还可以,然后通过按钮去选择月份渲染,如果展示一年的数据的话,就有点小复杂啦,那么多数组,还不确定,能挤得下吗?哈哈

效果图展示

主要是X轴数据那么多,还不确定,只能看X轴能不能自适应撑开并且能不能实现滑动,然后就查到了可以实现滑动对X轴放大或者缩放,那就好办啦!

先把实现效果图表展示一下,如下图:
Echarts—X轴鼠标滑动或者缩放/多列柱状图中某一列数据为0时不占位
Echarts—X轴鼠标滑动或者缩放/多列柱状图中某一列数据为0时不占位

图表上的数据也是自己随意mock的,由于柱子数量不确定,颜色也是随机的,这些都不要太在意了,重点是图表的实现;

还有,以上柱状图主要涉及到知识点有两个,也顺便分享一下:
1.X轴鼠标滑动或者缩放;
2.多列柱状图中其中某一列数据为0时不占位;

X轴鼠标滑动或者缩放设置

 dataZoom : [{
     type: 'slider',//给x轴设置滚动条
       show: true, //flase直接隐藏图形
       xAxisIndex: [0,1,2,3,4,5,6,7,8,9,10,11],
       bottom:5,
       height:15,
       showDetail: true,
       startValue: 0,//滚动条的起始位置
       endValue: 4 //滚动条的截止位置(按比例分割你的柱状图x轴长度)
     },
     {
       type: 'inside',//设置鼠标滚轮缩放
       disabled: true,
       xAxisIndex: [0,1,2,3,4,5,6,7,8,9,10,11],
       startValue: 0,
       endValue: 4
 }],

多列柱状图中某一列数据为0时不占位

正常多列柱状图,某一列数据为0时,是不显示的,但是还是会占位的,如下图:
Echarts—X轴鼠标滑动或者缩放/多列柱状图中某一列数据为0时不占位
很明显这样是很难看的,我们要遍历然后过滤掉value值为0的柱子,把有值的柱形数据塞到 series 中,但是要配合xAxis 数据,所以我们重新格式化了一下xAxis 和 series ,方法如下图:

  let xAxis=[]
  let xAxisitem={
      type: 'category',
      data: '',
      position: 'bottom',
      axisTick: {
          show: true
      },
  }
  var emphasisStyle = {
    itemStyle: {
      shadowBlur: 10,
      shadowColor: 'rgba(0,0,0,0.3)'
    }
  };
  let xAxisitemdata=[]
  for (let i = 0; i < valueData.length ; i++) {
      xAxisitemdata=[]
      for (let i = 0; i < valueData.length ; i++) {
          xAxisitemdata.push('')
      }
      xAxisitemdata[i]=valueData[i].name
      xAxisitem.data=JSON.parse(JSON.stringify(xAxisitemdata))
      xAxis.push(JSON.parse(JSON.stringify(xAxisitem)))
  }
   // console.log("xAxis",xAxis)


   let series=[]

   for (let j = 0; j < valueData.length; j++) {
       for (let i = 0; i < valueData[j].data.length; i++) {
           let newArrList = [];
           for (let a = 0; a < j; a++) {
               newArrList.push({});
           }
           newArrList[j] = valueData[j].data[i];
           for (let k = 0; k < legenddata.length; k++) {
               let seriesitem={
                   type: 'bar',
                   name:legenddata[i],
                   barWidth: '10',
                   xAxisIndex: j,
                   emphasis: emphasisStyle,
                   itemStyle:{
                     barBorderRadius: [5, 5, 0, 0],//(顺时针左上,右上,右下,左下)
                   },
                   data: newArrList,
               }
               let a = j % legenddata.length;
               if((valueData[j].data[i]).value !==0 && k===a){
                   series.push(JSON.parse(JSON.stringify(seriesitem)))
               }
           }
       }
   }
   //console.log("series",series)
  

打印的xAxis 如下图:

Echarts—X轴鼠标滑动或者缩放/多列柱状图中某一列数据为0时不占位
注意看红框标记的,每月的data,只有当月显示,其他月为空;

打印的series如下图:

Echarts—X轴鼠标滑动或者缩放/多列柱状图中某一列数据为0时不占位
12个月,按10个项目,正常数据应该有120个,这里只有81个,就是所有有值的柱子的集合,把值为0的已经过滤掉,不显示,这样就不会在图表中占位;

全部代码展示

下面我们就把上面图表的实现的全部代码展示出来,开袋即食!

 <template>
   <div id="myChartFour"  style="height: 260px;"></div>
 </template>
 
 <script>
 import Vue from 'vue'
 export default {
   data(){
     return{
       echartData:[]
     }
   },
   mounted(){
       this.getEchartData()
   },
   methods:{
    getEchartData(){
        Vue.axios.get('/getReportDataFour', {}).then(res => {
            if(res.status == 200){
               this.echartData = res.data.datalist
               this.initEchart(this.echartData)
            }
        })
    },
    initEchart(valueData) {
        var chartDom = document.getElementById('myChartFour');
        var myChart = this.$echarts.init(chartDom);
        //这个是获取legenddata,把每一个项目名称塞进去,后面也是为了和color配合自定义颜色
        let legenddata = []
        var singleData = valueData[0].data
        singleData .forEach( item => {
          legenddata.push(item.name)
        })
        
        //这里我们要重新格式化一下xAxis的属性,如果数据不多的话,直接写死也可以
        let xAxis=[]
        let xAxisitem={
            type: 'category',
            data: '',
            position: 'bottom',
            axisTick: {
                show: true
            },
        }
        var emphasisStyle = {
          itemStyle: {
            shadowBlur: 10,
            shadowColor: 'rgba(0,0,0,0.3)'
          }
        };
        let xAxisitemdata=[]
        for (let i = 0; i < valueData.length ; i++) {
            xAxisitemdata=[]
            for (let i = 0; i < valueData.length ; i++) {
                xAxisitemdata.push('')
            }
            xAxisitemdata[i]=valueData[i].name
            xAxisitem.data=JSON.parse(JSON.stringify(xAxisitemdata))
            xAxis.push(JSON.parse(JSON.stringify(xAxisitem)))
        }
        console.log("xAxis",xAxis)
        
        //重新格式化series,把柱状图每一列为空的过滤掉
        let series=[]
        for (let j = 0; j < valueData.length; j++) {
            for (let i = 0; i < valueData[j].data.length; i++) {
                let newArrList = [];
                for (let a = 0; a < j; a++) {
                    newArrList.push({});
                }
                newArrList[j] = valueData[j].data[i];
                for (let k = 0; k < legenddata.length; k++) {
                    let seriesitem={
                        type: 'bar',
                        name:legenddata[i],
                        barWidth: '10',
                        xAxisIndex: j,
                        emphasis: emphasisStyle,
                        itemStyle:{
                          barBorderRadius: [5, 5, 0, 0],//(顺时针左上,右上,右下,左下)
                        },
                        data: newArrList,
                    }
                    let a = j % legenddata.length;
                    if((valueData[j].data[i]).value !==0 && k===a){
                        series.push(JSON.parse(JSON.stringify(seriesitem)))
                    }
                }
            }
        }
        console.log("series",series)
        let series1= JSON.parse(JSON.stringify(series))
        
        //此函数是随机生成颜色的
        function getColor(num){
          var colorArr = []
          var colorValue="0,1,2,3,4,5,6,7,8,9,a,b,c,d,e,f";
          //以","为分隔符,将colorValue字符串分割为字符数组["0","1",...,"f"]
          var colorArray = colorValue.split(",");
          
          for( var j = 0; j<num;j++){
            var color="#";
            for(var i=0;i<6;i++){
                  color+=colorArray[Math.floor(Math.random()*16)];
              }
              colorArr.push(color)
          }
          return  colorArr
        }
        
        const option = {
            tooltip: {
              extraCssText: 'box-shadow: 0 0 3px rgba(0, 0, 0, 0.5);',
              backgroundColor:'rgba(255,255,255,.8)',
              confine: true ,
              textStyle:{
                  color: '#3d3d3d' ,
                  fontSize: 14 ,
              },
              formatter: function(params) {
                    const result = params.data
                    var apercent = result.a !== 0 ? ((result.a / result.value) * 100) .toFixed(1) + '%' : '0%'
                    var bpercent = result.b !== 0 ? ((result.b / result.value) * 100) .toFixed(1) + '%' : '0%'
                    var cpercent = result.c !== 0 ? ((result.c / result.value) * 100) .toFixed(1) + '%' : '0%'
                    var dpercent = result.d !== 0 ? ((result.d / result.value) * 100) .toFixed(1) + '%' : '0%'
                    return  `
                       <div style="padding:10px 20px 10px 10px">
                         <div>
                            <span style="font-size:14px;font-weight:700">${params.seriesName}</span><span style="margin-left:15px;font-weight:700">${result.value}个</span>
                         </div>
                         <ul>
                            <li style="padding:3px 0;">${params.marker}A级:<span style="padding:0 15px;">${result.a}个</span><span>${apercent}</span></li>
                            <li style="padding:3px 0;">${params.marker}B级:<span style="padding:0 15px;">${result.b}个</span><span>${bpercent}</span></li>
                            <li style="padding:3px 0;">${params.marker}C级:<span style="padding:0 15px;">${result.c}个</span><span>${cpercent}</span></li>
                            <li style="padding:3px 0;">${params.marker}D级:<span style="padding:0 15px;">${result.d}个</span><span>${dpercent}</span></li>
                         </ul>
                       </div>
                    `
                }
            },
            color:getColor(legenddata.length),
            legend:{
              show:false,
              data:legenddata,
            },
            dataZoom : [{
                  type: 'slider',//给x轴设置滚动条
                  show: true, //flase直接隐藏图形
                  xAxisIndex: [0,1,2,3,4,5,6,7,8,9,10,11],
                  bottom:5,
                  height:15,
                  showDetail: true,
                  startValue: 0,//滚动条的起始位置
                  endValue: 4 //滚动条的截止位置(按比例分割你的柱状图x轴长度)
                },
                {
                  type: 'inside',//设置鼠标滚轮缩放
                  disabled: false,
                  xAxisIndex: [0,1,2,3,4,5,6,7,8,9,10,11],
                  startValue: 0,
                  endValue: 4
            }],
            grid: {
                left: 40,
                right: 10,
                top: 25,
                bottom: 25,
            },
            xAxis: xAxis,
            yAxis: [
                {
                    type: 'value',
                    name:'供应商数量(个)',
                    nameGap: 10,
                    // max:12,
                    nameTextStyle:{

                    },
                    splitLine:{
                        show :true,
                        lineStyle:{
                          type:'dashed'
                        }
                    },
                    
                }
            ],
            series:series1
        };
        myChart.setOption(option)
        window.addEventListener("resize", () => {
            myChart.resize();
        });
    },
   }
 }
 </script>

mock的数据结构如下图:文章来源地址https://www.toymoban.com/news/detail-489346.html

{
    "datalist":[
        {
            "name":"1月",
            "data":[
                {"value":10,"a":2,"b":3,"c":4,"d":1,"name":"项目一"},
                {"value":8,"a":2,"b":3,"c":4,"d":1,"name":"项目二"},
                {"value":6,"a":2,"b":3,"c":4,"d":1,"name":"项目三"},
                ...
            ]
        },
        {
            "name":"2月",
            "data":[
                {"value":0,"a":0,"b":0,"c":0,"d":0,"name":"项目一"},
                {"value":8,"a":2,"b":3,"c":4,"d":1,"name":"项目二"},
                {"value":4,"a":2,"b":3,"c":4,"d":1,"name":"项目三"},
                ...
            ]
        },
        {
            "name":"3月",
            "data":[
                {"value":0,"a":0,"b":0,"c":0,"d":0,"name":"项目一"},
                {"value":0,"a":0,"b":0,"c":0,"d":0,"name":"项目二"},
                {"value":0,"a":0,"b":0,"c":0,"d":0,"name":"项目三"},
                ...
            ]
        },
        ...
        
    ]
}

到了这里,关于Echarts—X轴鼠标滑动或者缩放/多列柱状图中某一列数据为0时不占位的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • echarts 柱形图 Y轴数据多,鼠标滚动显示数据,不缩放

    坐标轴数据太多,只能滚动显示,滚动的时候,不想缩放,单纯平移就好。 滚动后第二屏的截图   没滚动的,第一屏的截图  

    2024年02月12日
    浏览(43)
  • 详解:当鼠标放上echarts图形时,显示数据、名称,或者自定义tooltip弹窗

     主要知识点:tooltip{}该配置项为:提示框组件相关设置 写入代码的位置如下,tooltip与xAxis同级 效果一实现代码 效果二实现代码: 更加灵活的自定义弹窗,可以自己写html,其中 params[0].marker 是柱形颜色的圆形,其他参数可以打印 params查看一下 然后拼接进html里 写入代码的位

    2024年02月11日
    浏览(39)
  • ● 84.柱状图中最大的矩形

     84.柱状图中最大的矩形

    2024年02月11日
    浏览(41)
  • Qwt QwtPlotMultiBarChart绘制多列柱状图

    1.概述 QwtPlotMultiBarChart 是 Qwt 绘图库中的一个类,用于绘制多列柱状图。它可以显示多个柱状条并将它们按照不同的类别分组显示。每个类别下的柱状条可以有不同的颜色和宽度。 以下是类继承关系图: 2.常用方法 设置数据: void setSamples (const QVector QwtSetSample ) void setSampl

    2024年02月06日
    浏览(25)
  • LeetCode 84. 柱状图中最大的矩形

    84. 柱状图中最大的矩形 给定 n 个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为 1 。 求在该柱状图中,能够勾勒出来的矩形的最大面积。 示例 1: 输入: heights = [2,1,5,6,2,3] 输出: 10 解释: 最大的矩形为图中红色区域,面积为 10 示例 2: 输入

    2024年02月03日
    浏览(33)
  • (力扣记录)84. 柱状图中最大的矩形

    数据结构类型: 栈 时间复杂度: O(N) 空间复杂度: O(N) 代码实现:

    2024年01月20日
    浏览(37)
  • 【算法练习Day51】柱状图中最大的矩形

    ​📝个人主页:@Sherry的成长之路 🏠学习社区:Sherry的成长之路(个人社区) 📖专栏链接:练题 🎯 长路漫漫浩浩,万事皆有期待 力扣题目链接 给定 n 个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为 1 。 求在该柱状图中,能够勾勒出来的矩

    2024年01月22日
    浏览(43)
  • 算法刷题Day 60 柱状图中的最大矩阵

    暴力解法 超时了 分别找出当前位置左边 第一个 比自己小的索引(的后一个位置)和右边 第一个 比自己小的索引(的前一个位置),这个范围之内,就是以当前位置的高度所能达到的最大宽度。 单调栈 有了接雨水那道题的经验,这一道题可以模仿着做出了

    2024年02月14日
    浏览(55)
  • OJ练习第101题——柱状图中最大的矩形

    力扣链接:84. 柱状图中最大的矩形 给定 n 个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为 1 。 求在该柱状图中,能够勾勒出来的矩形的最大面积。 我们先嵌套一层 while 循环来向左找到第一个比柱体 i 高度小的柱体,这个过程是 O(N) 的; 单调

    2024年02月04日
    浏览(35)
  • 算法修炼Day60|● 84.柱状图中最大的矩形

     LeetCode:84.柱状图中最大的矩形 84. 柱状图中最大的矩形 - 力扣(LeetCode) 1.思路 双指针思路,以当前数组为中心,借助两个数组存放当前数柱左右两侧小于当前数柱高度的索引,进行h*w的计算。注意首尾节点的左侧索引和右侧索引需要单独声名为0. 单调栈,在原数组的基础上

    2024年02月11日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包