Echarts柱状图label优化历程

news2024/11/27 6:31:59

问题1

由于项目数据记录多或者数据值大的时候,会出现label重叠的现象,如下图。

解决方案

针对上述问题,解决思路如下:

1、求Y轴的最大值(我们用Y轴的最大值,去计算每个柱子在整个图中的占比)

2、计算每个数据的占比

3、占比小于某个值的label,向上移动一定距离

技术实现

求Y轴的最大值

由上图可知,我们有计划值、完成值两组数据,且这两组值共用一个Y轴。

上图为观察的5组数据的值。

echarts默认分割段数为5,为了计算最大值,我们还默认为5。刚开始从网上找了一个求最大值的公式,计算后如上图的第一行,发现步长不好看,有可能还会有小数。

后来使用echarts默认的最大值,为上图第二行。

数据的最大值为上图的第三行。

最大值的步长为第四行。

默认步长为第五行。

经观察及多次试验发现步长可通过如下公式计算:

// 获取步长
const getStep = (value, count) => { // count是计算的层数
     let num = Math.ceil(value / 10);
     return num > 15 ? getStep(num, count + 1) : num * Math.pow(10, count);
}
// 求最大值
let stepVal = getStep(_.max(dataList) / 5, 1); // dataList - 计划值、完成值组成的数组
maxVal = stepVal * 5;

计算每个数据的占比

经上步可计算出每个数据在整个图中的占比。

let planRatio = parseFloat((plan / maxVal * 100).toFixed(2)); // 计划比
let nowRatio = parseFloat((now / maxVal * 100).toFixed(2)); // 完成比

移动label

通过各数据的占比,计算两者之间的差值,当差距小于n时,让该值的label向上移动。

// 移动label
data1.forEach((item, index) => {
    let planRatio = parseFloat((item / maxVal * 100).toFixed(2)); // 计划比
    let nowRatio = parseFloat((data2[index] / maxVal * 100).toFixed(2)); // 完成比
    let nowVal;
    if (data2[index] === 0) {
         nowVal = data2[index];
    } else { // 两个比值小于5,错落显示
         nowVal = Math.abs(nowRatio - planRatio) < 4 ? {value: data2[index], label: {offset: [0, -20]}} : data2[index];
    }
            
    option.series[0].data.push(item);
    option.series[1].data.push(nowVal);
})

最终效果图

问题2

为了视觉上更直观,客户要求将平面柱状图改成立体柱状图,效果如下。

 

思路

普通柱状图(bar)+ 象形柱图(pictorialBar)

 难点1

由于数据是不固定的,所以当数据量大的时候,普通柱状图的柱子宽度会自适应,而象形图的大小确是固定的,所以会出现顶部椭圆和柱子宽度不匹配的现象,如下图

 

解决方案

根据数据长度,动态设置象形图的大小及偏移位置。

// 不同数据长度对应不同柱子宽度
const getSymbolSize = () => {
   let len = dataName.length;
   switch (len) {
       case 6:
          return [24, 10];
       case 7:
          return [20, 8];
       case 8:
          return [18, 8];
                
       default:
          return [24, 10];
    }
}
// 不同数据长度对应不同柱子偏移
const getSymbolOffset = (i) => {
    let len = dataName.length;
    switch (len) {
        case 6:
           return i === 2 ? [-12, -6] : [12, -6];
        case 7:
           return i === 2 ? [-11, -5] : [11, -5];
        case 8:
           return i == 2 ? [-9, -5] : [9, -5];
        default:
           return i === 2 ? [-12, -6] : [12, -6];
     }
}

难点2

在echarts图中,z值控制图形的前后顺序。z值小的图形会被z值大的图形覆盖。由于象形图的z值比柱状图的z值大,所以会把柱状图的label值给覆盖了,如下图。

解决方案

将label值根据数据的大小动态的显示到柱状图或者象形图上。

PS:不可以直接显示到象形图上,因为数据值很小的情况只看到了象形图,所以不显示象形图

 

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

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

相关文章

分布式文件系统

0.0 分布式文件系统 一般做法&#xff1a; 传统的模式是我们通过tomcat或者nginx&#xff0c;存放静态资源文件。 存在的问题&#xff1a; 单个节点会出现存不下的情况&#xff0c;需要多个节点。 分布式文件系统 需要一个系统来管理多个计算机节点上的文件数据&#xff…

[附源码]计算机毕业设计JAVA小锅米线点餐管理系统

[附源码]计算机毕业设计JAVA小锅米线点餐管理系统 项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM my…

Python Faker库造伪数据

pip install Faker -i https://pypi.tuna.tsinghua.edu.cn/simple 在生成数据时&#xff0c;先调用unique&#xff0c;上面例子中的代码则改成下面这样 from faker import Faker def faker_demo(n): f Faker(“zh-CN”) l [] for i in range(n): # 代码更改处&#xff0c;…

安全高效应对混合办公新趋势 腾讯四大协同办公产品亮相

11月30日下午&#xff0c;2022腾讯全球数字生态大会「安全高效协同办公」专场在线上召开。论坛针对混合办公变革下的安全风险进行解析&#xff0c;并给出便捷规范的评估工具协助各行业客户评估自身办公安全成熟度&#xff0c;详细解读了腾讯数据安全解决方案、腾讯零信任iOA、腾…

Docker快速入门【极速浏览版】

文章目录11.1 Docker为什么出现1.2 Docker理念1.3 容器和虚拟机比较⭐️1.4 容器为什么比虚拟机快&#xff1f;⭐️1.5 Docker的基本组成⭐️1.6 Docker一个基本流程⭐️1.7 Docker架构⭐️1.7.1 入门版1.7.2 架构板22.1 Centos Docker安装2.2 前提条件2.3 官网安装doc2.4 查看…

安科瑞集中监控,剩余电流监测,温度保护电气火灾监控探测器

安科瑞 王晶淼/司红霞 一、电气火灾和爆炸的原因 电气火灾和爆炸在火灾、爆炸事故中占有很大的比例。如线路、电动机、开关等电气设备都可能引起火灾。变压器等带油电气设备除了可能发生火灾,还有爆炸的危险。造成电气火灾与爆炸的原因很多。除设备缺陷、安装不当等设计和施工…

人工智能-机器学习-深度学习-概述

文章目录一&#xff1a;人工智能需要的基础和涉及内容二&#xff1a;数学基础&#xff08;1&#xff09;线性代数&#xff08;2&#xff09;概率论&#xff08;3&#xff09;数理统计&#xff08;4&#xff09;最优化方法&#xff08;5&#xff09;信息论三&#xff1a;机器学习…

【ESD专题】案例:都是集成TVS管,为什么第一眼就发现不能导入?

本案例是在TVS管导入替代料时看规格书阶段发现的。如下所示为我司常用的集成TVS管,管子是四通道单向低寄生电容的。 电路框图和Top面的PIN脚与标识如下: 要导入的替代料介绍如下:可以看出也是4路ESD保护结构,也是低电容的高速接口。 电路框图和PI…

VMware虚拟机ubuntu网络配置以及ifconfig命令

文章目录VMware虚拟机联网NAT模式配置NAT联网原理手动配置网络关于apt命令关于ifconfig命令简介命令格式命令参数使用实例显示网络设备信息(激活状态的)开启/禁用网络VMware虚拟机联网 VMware提供:桥接,Host Only和NAT三种连网方式。 本文介绍的是NAT模式的具体设置方法&…

知识产权对接服务小程序开发,实现利益高效化

知识产权是市场经济的产物&#xff0c;所以知识产权的所属价值最终也是由市场所决定。科技的不断进步&#xff0c;让国内知识产权的申请量与注册量都显著增加&#xff0c;国家及国内科技企业对于知识产权的重视程度也显著提升&#xff0c;知识产权服务行业也迎来了飞速发展。很…

JVM运行时数据 堆

JVM运行时数据 堆快速调试堆参数设置堆分类运行流程Minor GC、Major GC与Full GC分代思想内存分配策略TLAB堆空间参数设置快速调试 一个JVM实例只存在一个堆内存&#xff0c;对也是Java内存管理的核心区域Java 堆区在Jvm启动的时候创建&#xff0c;其空间大小也就确定了。是JV…

缓存同步之 RabbitMQ 和 Canal

缓存同步 大多数情况下&#xff0c;浏览器查询到的都是缓存数据&#xff0c;如果缓存数据与数据库数据存在较大差异&#xff0c;可能会产生比较严重的后果。所以我们必须保证数据库数据、缓存数据的一致性&#xff0c;这就是缓存与数据库的同步。 数据同步策略 设置有效期&a…

Postman接口Mock Server服务器设置

目录 一、适用场景 二、设置步骤 2.1.创建一个mock server 2.2.配置mock server 2.3.Mock Servers创建成功一个新的mock地址 2.4.环境变量Environments&#xff1a;生成一个mock server新的环境变量 2.5.项目集Collections&#xff1a;生成一个mock server新的项目集&am…

Vue3 - Pinia 状态管理,解构 store(Pinia storeToRefs API 详细使用教程)

目录前言ES 解构方式&#xff08;错误的&#xff09;storeToRefs&#xff08;正确的&#xff09;总结SEO前言 解构啥意思呢&#xff1f;大家应该对 ES 传统方式解构非常了解&#xff0c;相同的&#xff0c;解构 store 也是如此。 假设你在状态管理仓库中定义很多很多数据&#…

BGP课后

文章目录实验要求拓扑图连接表1 网络连接规划表表2 网络设备明细表表3 IP规划表各设备的IP地址配置OSPF协议配置及BGP协议配置在R1、R2和R3上配置ospf协议在R2、R3、R4和R5上配置BGP协议路由引入利用路由策略实现路由过滤某一学校拟对单位网络进行规划设计。请根据下列具体要求…

适配高DPI QWidget::move移动有错误?

适配高DPI QWidget::move移动有错误&#xff1f; 1、现象 在适配高DPI文章发布之后&#xff0c;有个小伙伴立马联系我说增加了这个特性之后&#xff0c;发现一个移动坐标的问题。 比如说&#xff1a;QWidget::move(500, 500)&#xff0c;在实际的高DPI屏幕上移动的像素并不是…

[附源码]Python计算机毕业设计Django的汽车租赁系统

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

Linux下使用kvm搭建虚拟机群

Linux下使用kvm搭建虚拟机群 1.安装kvm 1.检查cpu是否支持虚拟化 [rootkevin ~]# grep vmx /proc/cpuinfo 如果有vmx信息输出&#xff0c;就说明支持VT;如果没有任何的输出&#xff0c;说明你的cpu不支持&#xff0c;将无法使用KVM虚拟机。 2.确保BIOS里开启虚拟化功能&…

three.js之材质

文章目录简介常用材质点材质线材质网格模型材质和模型的对应关系属性公有属性sideopacity私有属性专栏目录请点击 简介 所谓材质&#xff0c;就是平常我们所说的塑料材质&#xff0c;金属材质&#xff0c;纤维材质等实质上所有材质都是WebGL着色器代码的封装 常用材质 点材质…

2023年湖北监理工程师报考条件和专业要求有哪些? 甘建二告诉你

2023年湖北监理工程师报考条件和专业要求有哪些&#xff1f; 一、2023年湖北监理工程师报考条件详细解读&#xff1a; 1、大专毕业满足4年&#xff0c;毕业专业理工类或者工科类专业毕业&#xff0c;监理工程师分为3个专业&#xff0c;土建、交通、水利三个专业对于报考专业要…