ECharts柱状图实现从y轴指定数渲染,而不是始终从y=0处渲染

news2024/9/23 3:21:42

咱们先看看对比图,下图是echarts统计图放入数据不做处理的结果(只看蓝色柱子即可),可以看到柱状图不管数据时正数还是负数,都是以y=0为图形的起点
在这里插入图片描述
下图是我想要实现的效果,相当于是以y轴最小值为起点渲染柱子:
在这里插入图片描述
话不多说,直接上解决方案:
方案1:如果echarts版本是4.0.0以下(没记错的话),那么实现就很简单了
如果不知道使用的是什么版本的eacharts,可以打印console.log(echarts.version);看看是什么版本的,高于4.0版本的很有可能也是无法达到这个效果的
在xAxis内添加属性axisLine.onZero = false即可,代码如下:

xAxis: {
                data: ['衬衫11111111111111111', '羊毛衫', '雪纺衫', '裤子', '高跟鞋'],
                axisLine: {
                    onZero: false, //轴线是否在0刻度轴上
                },

            },

使用了axisLine.onZero = false但是达不到效果的话,可以直接引用以下版本看看能否实现,若能达到效果,八成是echarts版本问题了

<script crossorigin="anonymous" integrity="sha384-mYHbpb8SNpRR9uL7PfZoWk1rI3/VXsAkIC5Sy7+Aa7a79JKqZ19qg4OcgvgsCx36"
    src="https://lib.baomitu.com/echarts/4.0.0/echarts.min.js"></script>

(ps:之前翻看了echarts GitHub上的问题记录, 5.5.0版本以后可以使用barSeries.startValue设置起始值,但是貌似目前这个版本还未发布,具体问题自行参考:https://github.com/apache/echarts/pull/17078)

方案2:使用堆叠柱状图实现
思路:
代码如下:

 <body>
    <!-- 为 ECharts 准备一个定义了宽高的 DOM -->
    <div id="main" style="width: 600px;height:500px;"></div>
 <script type="text/javascript">
        // 基于准备好的dom,初始化echarts实例
        var myChart = echarts.init(document.getElementById('main'));
 let xData = ['衬衫11111111111111111', '羊毛衫', '雪纺衫', '裤子', '高跟鞋']
        let data1 = [20, 8, -18, -26, -37] //bar1数据
        let data2 = [] //bar2数据
        // 计算y轴最小值(根据自己实际情况而定)-------------------------
        let yMin = Math.ceil(Math.min(...data1))
        if (yMin < 0) {
            let numConvert = yMin;
            numConvert = yMin * -1
            let str = numConvert.toString().length;
            let arr = [1, 10, 100, 1000, 10000]
            let digit; //位数
            let num = 1
            if (str === 1) {
                // 个位
                digit = parseInt(yMin % 10);
                if (digit < 0) {
                    num = -1
                }
                yMin = num * 10
            } else {
                digit = parseInt((yMin % arr[str]) / arr[str - 1]);
                if (digit < 0) {
                    num = -1
                }
                yMin = (digit + num) * arr[str - 1]
            }
            //--------------------------------------------------
            //bar2值设置
            data1.forEach(item => {
                if (item > 0) {
                    data2.push(yMin)
                } else {
                    data2.push(item + yMin)
                }
            })
        } else {
            data2 = [0, 0, 0, 0, 0] //我这是柱状图固定只显示5个柱子,实际情况自行改逻辑
        }
         var option = {
          tooltip: {
                show: true,
                trigger: 'axis',
                formatter: function (par) {
                    return `<div>${par[0].name}</div><div>光功率:${par[0].value}</div>`
                }
            },
          xAxis: {
                data: xData,
                 axisLabel: {
                    // 文字省略
                    formatter: function (value) {
                        // console.log('999--', value);
                        if (value.length > 3) {
                            return `${value.slice(0, 3)}...`
                        }
                        return value
                    }
                },
                axisLine: {
                    onZero: false, //轴线是否在0刻度轴上
                },

            },
             yAxis: {
                splitLine: { show: false },
                min: yMin < 0 ? yMin : 0, //y最小值
            },
             series: [
             {
                    name: '销量',
                    type: 'bar',
                    stack: 'one', //设置堆叠图
                    data: data1.map(item => {
                        return {
                            value: item,
                            label: {
                                formatter: '{c}' + 'db',
                                show: item > 0 ? true : false, //bar1数据大于0顶部显示提示文字
                                position: 'top',
                                textStyle: {
                                    color: 'blue'
                                },
                            },
                            itemStyle: {
                                // 边框
                                borderColor: item > 0 ?"blue":"rgba(240, 240, 240,0)",
                            }
                        }
                    }),
                    barWidth: '50px', // 柱子宽度
                    itemStyle: {
                        normal: {
                        //bar1颜色控制,小于0,颜色与背景色相同,否则为蓝色
                            color: function (param) {
                                let color = "blue"
                                if (param.value < 0) {
                                    color = "rgba(240, 240, 240,0)"
                                }
                                return color
                            },
                        }
                    },
                    //设置柱状图背景
                    showBackground: true,
                    backgroundStyle: {
                        color: 'rgba(180, 180, 180, 0.2)'
                    },
                },
                {
                    name: 'bar2',
                    type: 'bar',
                    stack: 'one',
                    itemStyle: {
                        normal: {
                            color: "blue",
                            borderColor: "blue", //边框
                        }
                    },
                    barWidth: '50px', // 柱子宽度
                    data: data2.map((item, index) => {
                        return {
                            value: item,
                            label: {
                                formatter: data1[index] + 'db',
                                //bar1当前数据小于0,bar2顶部显示提示文字,否则不显示
                                show: data1[index] < 0 ? true : false,
                                position: 'top',
                                textStyle: {
                                    color: 'blue'
                                },
                            },
                        }
                    }),
                },
             ]


         }
          // 使用刚指定的配置项和数据显示图表。
        myChart.setOption(option);
        </script>
        </body>

完结~~~(方法不一定很好,仅供参考)

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

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

相关文章

如何将数字高程模型加载到地图中查看,并进行在线编辑和分享?

四维轻云是一款地理空间数据在线管理平台&#xff0c;具有地理空间数据的在线管理、查看及分享等功能。在四维轻云平台中&#xff0c;用户可以将数据加载至地图中查看&#xff0c;并使用渲染、视图、标绘等工具。 现在&#xff0c;小编就来告诉大家如何将数字高程模型加载到地…

git从主仓库同步到fork仓库

git从主仓库同步到fork仓库 1. fork远程仓库到本地仓库2. 将远程仓库添加到本地3. 更新本地项目主库地址4. 将远程仓库更新到本地仓库5. 将本地仓库合到远程分支 1. fork远程仓库到本地仓库 方式一&#xff1a;通过git命令 git clone fork库地址方式二&#xff1a;通过git页面…

home-assistant整合sso

其他软件都可以通过nginx直接做代理添加鉴权&#xff0c;但是这个hass果然是用户安全隐私很强&#xff0c;做代理需要配置白名单&#xff0c;而且支持的三方鉴权都不太适合我的需求&#xff0c;非要改源码才行&#xff0c;后来我发现不用改源码的折中方式 参考文章 External …

移动端适配rem

1.安装amfe-flexible和postcss-pxtorem&#xff0c; npm install amfe-flexible --save npm install postcss-pxtorem5.1.1 (这里我使用的postcss-pxtorem是5.1.1版本)或者在pageage.json中写入 "amfe-flexible": "^2.2.1","postcss-pxtorem": …

QT 视图(view)模型(model)汇总

QStringListModel和QListView UI界面 widget头文件 #ifndef WIDGET_H #define WIDGET_H#include <QStringList> #include <QStringListModel> #include <QWidget>QT_BEGIN_NAMESPACE namespace Ui { class Widget; } QT_END_NAMESPACEclass Widget : publi…

全面升级 | MoHub 2023b版本正式上线

为了满足装备数字化发展需求&#xff0c;为知识模型化与模型开放共享提供自主平台&#xff0c;同元软控于2023年初推出来工业知识模型互联服务平台MoHub。7月27日&#xff0c;工业知识模型互联平台MoHub 2023b如期升级上线。此次升级&#xff0c;面向平台用户重点在云化工具、知…

PDU+远控,企业如何应用工业级智能PDU远程赋能业务?

在很多企业级业务场景下&#xff0c;如何保障相关业务设备的稳定供电非常重要&#xff0c;插座也就成为了这些业务体系中的核心基建。 为了保证相关设备供电的稳定&#xff0c;并且实现高效的远程管理&#xff0c;很多企业级的业务场景会部署专业的智能PDU&#xff0c;而在众多…

医疗器械维修工程师心得

彩虹医械维修技能班9月将开展本年第三期长期班&#xff0c;目前咨询人员也陆续多了起来&#xff0c;很多刚了解到医疗行业的&#xff0c;自身也没有多少相关的基础&#xff0c;在咨询时会问到没有基础能否学的会&#xff1f; 做了这行业的都知道&#xff0c;无论多么复杂的设备…

探讨缓存一致性问题

探讨缓存一致性问题 本文只探讨只读缓存&#xff0c;即只对缓存进行读取、写入、删除&#xff0c;不进行更新操作 前言 数据库的读写性能上限是比较低的&#xff0c;工程中经常在数据库前面加一层缓存&#xff0c;可能是Redis或者本地缓存。既然有缓存&#xff0c;那么不可避免…

归并交换基数简单选择排序

文章目录 1 交换排序1.1 冒泡排序1.1.1 冒泡排序算法1.1.2 性能分析 1.2 快速排序1.2.1 快排的算法1.2.2 性能分析1.2.3 快排的特点 2 简单选择排序2.1 简单排序算法2.1.1 性能分析 2.2 堆排序2.2.1 堆的调整2.2.2 筛选过程算法2.2.3 堆的建立算法2.2.4 性能分析 3 归并排序3.1…

CertGetCertificateChain trust error CERT_TRUST_REVOCATION_STATUS_UNKNOWN

执行命令&#xff1a; curl --cacert http_ca.crt -u elastic https://localhost:9200 结果报错了 直接访问https://localhost:9200/ &#xff0c;正常 解决办法&#xff1a; curl --cacert http_ca.crt -u elastic https://localhost:9200 --insecure

微信小程序:实现提示窗确定,取消执行不同操作(消息提示确认取消)showModal

效果 代码 wx.showModal({title: 提示,content: 是否确认退出,success: function (res) {if (res.confirm) {console.log(用户点击确定)} else if (res.cancel) {console.log(用户点击取消)}}})

linux 故障定位

linux 故障定位 1. cpu1.1 说明1.2 分析工具1.3 使用方式 2. 内存2.1 说明2.2 分析工具2.3 使用方式 3. I/O3.1 说明3.2 分析工具3.3 使用方式 4. 网络4.1 说明4.2 分析工具4.3 使用方式 5. 系统负载5.1 说明5.2 分析工具5.3 使用方式 6. 火焰图6.1 说明6.2 安装依赖库6.3 安装…

应用程序流量警报软件

为了避免因使用资源密集型应用程序&#xff08;如基于云的应用程序&#xff09;而出现的潜在中断和延迟问题&#xff0c;企业需要监控应用程序流量并尽快找到网络事件的根本原因。业务的应用程序流量监视是了解业务关键型应用程序何时具有高时间可用性以及何时存在利用率超过基…

网上订货系统源码 购买后交付一些什么内容

随着电子商务的快速发展&#xff0c;越来越多的企业开始意识到建立一个高效的网上订货系统的重要性。网上订货系统不仅可以提高企业的销售效率&#xff0c;还可以降低成本&#xff0c;提升客户满意度。然而&#xff0c;要建立一个完善的网上订货系统并不容易&#xff0c;需要考…

SpringMVC 拦截器详解

目录 一、介绍 二、过滤器与拦截器的简单对比 三、自定义拦截器 四、注册拦截器 五、案例演示-登录拦截器 5.1 自定义拦截器 5.2 注册拦截器 编写的初衷是为了自己巩固复习&#xff0c;如果能帮到你将是我的荣幸❣️ 一、介绍 SpringMVC提供的拦截器类似于JavaWeb中的过…

火山引擎VeDI最新分享:消费行业的数据飞轮从“四更”开始

更多技术交流、求职机会&#xff0c;欢迎关注字节跳动数据平台微信公众号&#xff0c;回复【1】进入官方交流群 数据飞轮&#xff0c;正在为消费行业的数字化升级提供一套全新模式。 在刚刚结束的《全链路增长&#xff1a;数据飞轮转动消费新生力》专场活动上&#xff0c;火山引…

事务隔离:为什么你改了我还看不见

前提概要 你肯定不陌生&#xff0c;和数据库打交道的时候&#xff0c;我们总是会用到事务。最经典的例子就 是转账&#xff0c;你要给朋友小王转 100 块钱&#xff0c;而此时你的银行卡只有 100 块钱。 转账过程具体到程序里会有一系列的操作&#xff0c;比如查询余额、做加减法…

第五章 Scala 变量与运算符

1 变量 变量是一种使用方便的占位符&#xff0c;用于引用计算机内存地址&#xff0c;变量创建后会占用一定的内存空间。基于变量的数据类型&#xff0c;操作系统会进行内存分配并且决定什么将被储存在保留内存中。因此&#xff0c;通过给变量分配不同的数据类型&#xff0c;你…

MyBatis查询数据库入门学习<一>

目录 1.MyBatis 是什么&#xff1f; MyBatis官网&#xff1a;mybatis – MyBatis 3 | 简介 2.为什么要学习 MyBatis&#xff1f; 3.怎么学MyBatis&#xff1f; 4.第⼀个MyBatis查询 4.1 创建数据库和表 4.2 添加MyBatis框架⽀持 4.2.1 ⽼项⽬添加MyBatis 4.2.2 新项⽬添…