【echarts】动态滚动趋势图,解决坐标轴数据太多遮挡覆盖问题

news2024/10/6 22:32:59

写在前面

业务场景x轴的文字太多,会出现遮挡问题,想到文字倾斜展示,页面不美观,于是想到使用滚动条优化趋势图。
在这里插入图片描述

<template>
  <div id="storeDown" style="height: 400px;width:100%"/>
</template>

<script>
// 引入 ECharts 主模块

// var echarts = require('echarts/lib/echarts')
// 引入柱状图
import { round } from 'echarts/src/util/number'

require('echarts/lib/chart/bar')
// 引入折线图
require('echarts/lib/chart/line')
// 引入提示框和标题组件
require('echarts/lib/component/tooltip')
// require('echarts/lib/component/title');
require('echarts/lib/component/toolbox')
require('echarts/lib/component/legend')
export default {
  name: 'StoreGoDownEcharts',
  props: {
    itemList: {
      type: Array,
      default: () => []
    },
    type: {
      type: String,
      default: () => ''
    },
    th: {
      type: String,
      default: () => ''
    }
  },
  data() {
    return {
    }
  },
  watch: {
    itemList: {
      handler(newData, oldData) {
        if (this.itemList.length > 0) {
          this.myCharts5()
        }
      }
    }
  },
  mounted() {
    this.loadata()
  },
  methods: {
    loadata() {
      this.myCharts5()
    },
    myCharts5() {
      const that = this
      // const that = this
      var x_data = that.itemList.map((item) => {
        return item.store_name
      })
      var serve = []
      var serve2 = []
      console.log(that.th)
      var cycle = this.th === '同比' ? '同期' : '上周'
      if (this.type === '销售额') {
        serve = that.itemList.map((item) => {
          return { value: round(item.sales / 10000, 2), Name: this.type, th_name: this.th, th: this.th === '同比' ? item.sales_tongbi : item.sales_huanbi }
        })
        serve2 = that.itemList.map((item) => {
          return this.th === '同比' ? round(item.l_sales / 10000, 2) : round(item.l_week_tongqi_sales / 10000, 2)
        })
      } else if (this.type === '毛利额') {
        serve = that.itemList.map((item) => {
          return { value: round(item.gross / 10000, 2), Name: this.type, th_name: this.th, th: this.th === '同比' ? item.gross_tongbi : item.gross_huanbi }
        })
        serve2 = that.itemList.map((item) => {
          return this.th === '同比' ? round(item.l_gross / 10000, 2) : round(item.l_week_tongqi_gross / 10000, 2)
        })
      }
      var barwidthData = ''
      if (serve.length < 4 && serve2.length < 4) {
        barwidthData = '10%'
      }
      var myChart = this.$echarts.init(document.getElementById('storeDown'))
      // that.myReize(myChart)
      var option = {
        tooltip: {
          trigger: 'axis',
          axisPointer: {
            type: 'shadow'
          },
          formatter: function(params) {
            var store_name = params[0].name
            var type_0 = params[1].data.Name
            var th_name = params[1].data.th_name
            var cycle = params[0].seriesName
            var value = ''
            var value2 = ''
            var value3 = ''
            if (params[1].value) {
              value = params[1].value + '万元'
            } else {
              value = ''
            }
            if (params[0].value) {
              value2 = params[0].value + '万元'
            } else {
              value2 = ''
            }
            if (params[1].data.th) {
              value3 = Math.abs(params[1].data.th) + '%'
            } else {
              value3 = ''
            }
            var htmlStr = ''
            htmlStr = '<span style="font-size: 20px;font-weight: bold;color: #FEFEFE;line-height: 20px;">' + store_name + '</span>' +
                    '<br>' + '<span style="font-size: 16px;color: #FEFEFE;line-height: 22px;font-weight: bold; border-left:1px solid red ">&nbsp;&nbsp;' + type_0 + '</span>' +
              '<br>' + '<el-row style="display: flex;width: 200px"><el-col style="display: inline-block;width: 50%;">' + cycle + ':' + value2 + '</el-col>' + '<el-col style="display: inline-block;width: 50%;text-align: center">' + th_name + '<i class="el-icon-caret-bottom"></i></el-col></el-row>' +
              '<el-row style="display: flex;width: 200px"><span style="display: inline-block;width: 50%;">当日:' + value + '</span>' +
              '<span  style="display: inline-block;width: 50%;text-align: center">&nbsp;' + value3 + '</span></el-row>'
            return htmlStr
          }
        },
        xAxis: {
          type: 'category',
          data: x_data,
          triggerEvent: true,
          axisLabel: {
            interval: 0,
            rotate: -30,
            formatter: function(value) {
              if (value.length > 8) {
                value = value.substring(0, 7) + '..'
                return value
              } else {
                return value
              }
            }
          }
        },
        yAxis: {
          type: 'value',
          name: this.type + '(万元)'
        },
        legend: { data: [cycle, '当日'], top: '5px', right: '80px' },
        dataZoom: [
          {
            type: 'slider',
            show: true,
            start: 0,
            end: 40,
            handleSize: 8,
            yAxisIndex: null,
            width: '80%',
            height: '2%',
            bottom: '1',
            showDetail: false
          },
          {
            type: 'inside',
            start: 0,
            end: 100
          }
        ],
        series: [
          {
            name: cycle,
            data: serve2,
            barWidth: barwidthData,
            type: 'bar',
            itemStyle: {
              color: '#42B983'
            }
          },
          {
            name: '当日',
            data: serve,
            barWidth: barwidthData,
            type: 'bar',
            itemStyle: {
              color: '#CEF7D4'
            }
          }
        ]
      }
      myChart.setOption(option)
      window.addEventListener('resize', () => {
        myChart.resize()
      })
      that.extension(myChart)
      myChart.on('click', function(data) {
        // 添加点击事件
      })
    },
    extension(chart) {
      // 注意这里,是以X轴显示内容过长为例,如果是y轴的话,需要把params.componentType == 'xAxis'改为yAxis
      // 判断是否创建过div框,如果创建过就不再创建了
      // 该div用来盛放文本显示内容的,方便对其悬浮位置进行处理
      var elementDiv = document.getElementById('extension')
      if (!elementDiv) {
        var div = document.createElement('div')
        div.setAttribute('id', 'extension')
        div.style.display = 'block'
        document.querySelector('html').appendChild(div)
      }
      chart.on('mouseover', function(params) {
        if (params.componentType == 'xAxis') {
          var elementDiv = document.querySelector('#extension')
          // 设置悬浮文本的位置以及样式
          var elementStyle =
            'position: absolute;z-index: 99999;color: #fff;font-size: 12px;padding: 5px;display: inline;border-radius: 4px;background-color: #303133;box-shadow: rgba(0, 0, 0, 0.3) 2px 2px 8px'
          elementDiv.style.cssText = elementStyle
          elementDiv.innerHTML = params.value
          document.querySelector('html').onmousemove = function(event) {
            var elementDiv = document.querySelector('#extension')
            var xx = event.pageX - 10
            var yy = event.pageY + 15
            console.log('22', xx)
            elementDiv.style.top = yy + 'px'
            elementDiv.style.left = xx + 'px'
          }
        }
      })
      chart.on('mouseout', function(params) {
        // 注意这里,我是以X轴显示内容过长为例,如果是y轴的话,需要改为yAxis
        if (params.componentType == 'xAxis') {
          var elementDiv = document.querySelector('#extension')

          elementDiv.style.cssText = 'display:none'
        }
      })
    }
  }
}
</script>

<style scoped>

</style>

请添加图片描述
dataZoom 组件 用于区域缩放
在这里插入图片描述
在这里插入图片描述
参考文章:dataZoom 区域缩放组件

🚀写在最后

希望我的分享能够帮助到更多的人,如果觉得我的分享有帮助的话,请大家一键三连支持一下哦~
❤️原创不易,期待你的关注与支持~
点赞👍+收藏⭐️+评论✍️
😊之后我会继续更新前端学习小知识,关注我不迷路~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1428112.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

独立按键实验

轻触开关是一种电子开关&#xff0c;使用时,轻轻按开关按钮就可使开关接通&#xff0c;当松开手时,开关断开。我们使用的开关如下图&#xff1a; 按键在闭合和断开时&#xff0c;触点会存在抖动现象。 硬件消抖电路&#xff1a; 实现现象&#xff1a;下载程序后按下K1按键可以对…

C++类和对象知识点集合

又多又难的C类和对象知识点看这里了&#xff01;&#xff01;&#xff01;&#xff01;&#xff01; 文章目录 1.先看看类是咋用的2.访问限定符3.类中的声明和定义分离4.类对象模型4.1 空类的大小4.2 成员访问 5.内存对齐6.this指针6.1 this在哪里&#xff1f;6.2 (类对象及thi…

Mybatis 自定义ResultHandler(结果处理器)正确使用姿势

阅读指引 一、使用场景二、前提条件三、源码对照四、使用示例目标实现方式 一、使用场景 对Mybatis查询的结果集进行统一批量处理&#xff0c;如进行类型转换、数据变更等等。 二、前提条件 必须是查询语句。mapper方法的返回值必须是void&#xff0c;这也就是不能直接从这个…

【GitHub项目推荐--一个 C++ 实现快速存储的库】【转载】

一个提供可嵌入、持久键值存储以实现快速存储的库。 github地址 https://github.com/facebook/rocksdb 国内镜像 http://www.gitpp.com/ag/rocksdb RocksDB 是一个开源的嵌入式键值存储库&#xff0c;由 Facebook 开发&#xff0c;用于处理大量的数据&#xff0c;特别适合于…

【C++】C++入门 — 指针空值nullptr

C入门 指针空值 指针空值 在良好的C/C编程习惯中&#xff0c;声明一个变量时最好给该变量一个合适的初始值&#xff0c;否则可能会出现 不可预料的错误&#xff0c;比如未初始化的指针。如果一个指针没有合法的指向&#xff0c;我们基本都是按照如下 方式对其进行初始化: voi…

03 - python基础篇

1. 面向对象认识 1.1 面向过程 核心&#xff1a;怎么做 把需要完成的业务逻辑&#xff0c;所有步骤从头到尾逐步实现将某些功能独立的代码封装成函数最后&#xff0c;就是顺序调用不同的函数 注重步骤与过程&#xff0c;不注重职责分工。 1.2 面向对象 核心&#xff1a;谁…

【智慧农业】东胜物联温室监控系统硬件解决方案,自动化控制温室灯光、温湿度等

温室监控系统旨在提高智慧农业的工业生产率和效率。根据最近的一项研究&#xff0c;农业领域的物联网市场预计到2026年将达到约187亿美元。物联网技术包括自主耕作方法&#xff0c;帮助农场生产高质量的商品&#xff0c;并为农场经理提供最佳功能。某上市药企因业务需要&#x…

【Java 数据结构】对象的比较

Java中对象的比较 1. PriorityQueue中插入对象2. 元素的比较2.1 基本类型的比较2.2 对象比较的问题 3. 对象的比较3.1 覆写基类的equals3.2 基于Comparble接口类的比较3.3 基于比较器比较3.4 三种方式对比 4. 集合框架中PriorityQueue的比较方式5. 使用PriorityQueue创建大小堆…

Json序列化和反序列化 笔记

跟着施磊老师学C 下载&#xff1a;GitHub - nlohmann/json: JSON for Modern C 在single_include/nlohmann里头有一个json.hpp&#xff0c;把它放到我们的项目中就可以了 #include "json.hpp" using json nlohmann::json;#include <iostream> #include <…

基于SSM的个性化旅游攻略定制系统设计与实现(有报告)。Javaee项目。ssm项目。

演示视频&#xff1a; 基于SSM的个性化旅游攻略定制系统设计与实现&#xff08;有报告&#xff09;。Javaee项目。ssm项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构&#xf…

nosql数据库期末考试知识点总结

目录 1、什么是nosql数据库&#xff0c;它包括哪些 文档数据库 建数据 哪一种是最简单的 2、什么是文档数据库 3、创建mongodb时默认会建造三个数据库&#xff0c;是哪三个 4、mongodb支持的数据类型有哪些 5、它的常规语句有哪些 6、副本集和分片集有什么作用 复制 …

Linux中make和makefile

make与makefile 简单介绍常见用法符号替代自动寻找设置变量取消打印提示 简单介绍 make是Linux中一个命令&#xff0c;与之匹配的是makefile&#xff0c;makefile是一个文件。make会根据makefile中的内容完成对应的工作 创建一个名为makefile的文件 vim打开makefile 第一行是依…

Linux文本三剑客-awk

一、awk的介绍&#xff1a; 1.awk的简介&#xff1a; AWK 是一种处理文本文件的语言&#xff0c;是一个强大的文本分析工具 可以在无交互的模式下实现复杂的文本操作 相较于sed常作用于一整个行的处理&#xff0c;awk则比较倾向于一行当中分成数个字段来处理&#xff0c;因…

将vite项目(vue/react)使用vite-plugin-pwa配置为pwa应用,只需要3分钟即可

将项目配置为pwa模式&#xff0c;就可以在浏览器里面看到安装应用的选项&#xff0c;并且可以将web网页像app一样添加到手机桌面或者pad桌面上&#xff0c;或者是电脑桌面上&#xff0c;这样带来的体验就像真的在一个app上运行一样。为了实现这个目的&#xff0c;我们可以为vue…

openmax

通过EmptyThisBuffer传递未解码的buffer给component&#xff0c;component收到该命令后会去读取input port buffer中的数据&#xff0c;将其组装为帧之后进行解码&#xff0c;buffer处理完成后会通过EmptyBufferDone通知上层输入使用完成&#xff0c;上层收到命令可以继续送输入…

区块链游戏解说:什么是 SecondLive

数据源&#xff1a;SecondLive Dashboard 作者&#xff1a;lesleyfootprint.network 什么是 SecondLive SecondLive 是元宇宙居民的中心枢纽&#xff0c;拥有超过100 万用户的蓬勃社区。它的主要使命是促进自我表达&#xff0c;释放创造力&#xff0c;构建梦想中的平行宇宙…

Easy-Es操作Elasticsearch

文章目录 1 Easy-Es1.1 简介1.2 MySQL与Easy-Es语法对比1.3 集成及配置1.3.1 pom.xml1.3.2 配置 1.4 使用1.4.1 注解的使用1.4.2 EsMapper接口1.4.3 简单搜索 1.5 使用案例1.5.1 综合商品搜索1.5.2 相关商品推荐1.5.3 聚合搜索商品相关信息 1 Easy-Es 使用过Spring Data操作ES…

线性代数:矩阵的初等变换

目录 一、初等行变换 行阶梯 / 行最简 性质 二、矩阵的标准型 三、矩阵的等价 四、初等矩阵 五、重要性质与定理 一、初等行变换 行阶梯 / 行最简 性质 二、矩阵的标准型 三、矩阵的等价 四、初等矩阵 五、重要性质与定理

滑动窗口最终弹

力扣30.串联所有单词的子串&#xff08;巨困难&#xff09; 这个最难的是什么 1.代码的编写 2.容器的使用 class Solution {List<Integer>retnew LinkedList<>();//保存字典中所有单词的频次public List<Integer> findSubstring(String s, String[] words) …

美赛常见数据收集网站(最新、最全、全部可用+所有网站使用说明)

授人以鱼不如授人以渔&#xff0c;本次将会为大家更新如何去寻找赛中我们需要的数据集。 在数模界一直流传着一个数据库,据说报告了各种各样的数据收集网站,大家可能手里也有这样的数据库。但是这数据从2018我知道开始到现在一直没有变过。里面80%甚至90%的网站都无法使用&…