react ts 封装3D柱状图,支持渐变
留档,以防忘记
bar3D.tsx
import React, { useEffect, useRef, useState } from 'react';
import * as echarts from 'echarts';
import 'echarts/lib/chart/bar';
import 'echarts/lib/chart/pictorialBar';
import 'echarts/lib/component/grid';
import 'echarts/lib/component/tooltip';
import 'echarts/lib/component/title';
import 'echarts/lib/component/legend';interface IProps {name: string;tooltipUnit?: string;xdata: Array<string>;ydata: Array<number>;xLabelRotate?: number;barWidth?: number;barColor?: {left: {top: string;bottom: string;},right: {top: string;bottom: string;}}barCovers?: {left: string;right: string;}labelShow?: booleanlabelColor?: stringlabelFont?: numberoffsetTop?: number | string
}/**** 3D柱状图,支持柱子上下渐变** @param name string 图表名称* @param tooltipUnit string tooips 中显示的单位* @param xdata string[] x轴数据* @param ydata number[] y轴数据* @param xLabelRotate number x轴标签旋转角度* @param barWidth number 柱状图宽度* @param barColor object 柱状图颜色* @param barCovers object 柱状图顶部和底部盖子颜色* @param labelShow boolean 是否显示柱状图上方文字* @param labelColor string 柱状图上方文字颜色* @param labelFont number 柱状图上方文字大小* @param offsetTop number | string 柱状图上方文字偏移量** @returns*/const Bar3D = ({name = '安全监管',tooltipUnit = '%',xdata = ['bar1', 'bar2', 'bar3', 'bar4', 'bar5'],ydata = [18, 9, 15, 4],xLabelRotate = 0,barWidth = 25,barColor = {left: {top: '#37F1FD', // 柱子左侧顶部颜色bottom: '#12276F' // 柱子左侧底部颜色},right: {top: '#179DD1', // 柱子右侧底部颜色bottom: '#08154D'// 柱子右侧底部颜色}},barCovers = {left: '#34DFF1', // 柱子顶部和底部左侧盖子颜色right: '#1B5590'// 柱子顶部和底部右侧盖子颜色},labelShow = true,labelColor = '#fff',labelFont = 10,offsetTop = '-5'}: IProps) => {const echartDomRef = useRef<any>();useEffect(() => {setEchart();}, []);const setEchart = () => {const myChart = echarts.init(echartDomRef.current);const topArr: any = []; // 顶部棱盖const bottomArr: any = []; // 底部棱盖const leftArr: any = []; // 左侧柱子const rightArr: any = []; // 右侧柱子ydata.map((item: number, index: number) => {topArr.push({value: item,symbol: 'diamond',symbolOffset: [0, '-50%'],symbolPosition: 'end', // 图形边缘与柱子结束的地方内切symbolSize: [barWidth, barWidth * 0.4], // 根据柱子大小来做调整itemStyle: {normal: {color: {x: 1,y: 0,x2: 0,y2: 0,type: 'linear',global: false,colorStops: [{ offset: 0, color: barCovers.left },{ offset: 1, color: barCovers.right }]}}}});bottomArr.push({value: item,symbol: 'triangle',symbolOffset: [0, barWidth * 0.25],symbolSize: [-barWidth, barWidth * 0.25],symbolRotate: 180,itemStyle: {color: {x: 0,y: 0,x2: 1,y2: 0,type: 'linear',global: false,colorStops: [{ offset: 0, color: barColor.left.bottom },{ offset: 0.5, color: barColor.left.bottom },{ offset: 0.5, color: barColor.right.bottom },{ offset: 1, color: barColor.right.bottom }]}}});leftArr.push({value: item,itemStyle: {color: {x: 0,y: 0,x2: 0,y2: 1,type: 'linear',global: false,colorStops: [{ offset: 0, color: barColor.left.top },{ offset: 1, color: barColor.left.bottom }]}}});rightArr.push({value: item,itemStyle: {color: {x: 0,y: 0,x2: 0,y2: 1,type: 'linear',global: false,colorStops: [{ offset: 0, color: barColor.right.top },{ offset: 1, color: barColor.right.bottom }]}}});});const option = {grid: {left: 15,right: 15,bottom: 10,top: 30,containLabel: true},tooltip: {trigger: 'axis',confine: true,formatter: function (param: any) {let str = '';param.map((el: any, index: number) => {if (el.componentSubType === 'bar') {str = el.seriesName + '<br>' + el.marker + el.name + ':' + el.data.value + '' + tooltipUnit;}});return str;}},xAxis: [{type: 'category',data: xdata,axisTick: {show: false},axisLine: {show: false},splitLine: {show: false},axisLabel: {show: true,color: '#76A5D1',fontSize: 10,fontWeight: 300,rotate: xLabelRotate}}],yAxis: [{type: 'value',axisTick: {show: false},axisLine: {show: false},splitLine: {show: true,lineStyle: {color: '#082745'}},axisLabel: {show: true,color: '#76A5D1',fontSize: 10,fontWeight: 300}}],series: [{type: 'pictorialBar',name: '顶部棱盖',z: 10,data: topArr},{type: 'bar',name: name,barGap: '-50%',// symbol: 'image://' + params.picture, // 图片自己切或者让UI设计切喔symbolOffset: [0, 0],barWidth: barWidth / 2,z: 2,label: {show: labelShow,color: labelColor,fontSize: labelFont,position: 'top',offset: [barWidth / 4, Number(offsetTop)]},data: leftArr,},{type: 'bar',name: name,barGap: '-5%',// symbol: 'image://' + params.picture, // 图片自己切或者让UI设计切喔symbolOffset: [0, 0],barWidth: barWidth / 2,z: 3,data: rightArr},{type: 'pictorialBar',name: '底部棱盖',barGap: '-100%',z: 6,data: bottomArr}]};myChart.setOption(option);};return <div className='w-full h-full' ref={echartDomRef}></div>;
};export default Bar3D;
使用
<Bar3D name='近半年系统攻击统计' xdata={['自然安全', '事故安全', '公共卫生', '社会安全', '其他']} ydata={[100, 200, 300, 400, 900]} barWidth={15} />
效果

相关文章:
react ts 封装3D柱状图,支持渐变
留档,以防忘记 bar3D.tsx import React, { useEffect, useRef, useState } from react; import * as echarts from echarts; import echarts/lib/chart/bar; import echarts/lib/chart/pictorialBar; import echarts/lib/component/grid; import echarts/lib/comp…...
css---before和after伪元素
1.什么是伪元素 伪元素不是真正的页面元素,html没有对应的元素,但是其所有用法和表现行为与真正的页面元素一样,可以对其使用如页面元素一样的CSS样式,表面上看上去貌似是页面的某些元素来展现,实际上CSS样式展现的行…...
下载后端返回的图片,而不是打开图片
使用 window.location.href 和 window.open 后都是打开图片,原因是,当浏览器发现是浏览器支持的文件类型,例如 jpg、png、svg 等,默认是浏览器打开。 解决 fetch createObjectURL fetch 转换为 blob 对象 createObjectURL() 静…...
ELISA实验前,需要做好哪些准备?
进行ELISA试剂盒实验前,需要进行周密的准备工作以确保实验的顺利进行和实验的准确性。那么,具体应该做哪些准备呢?欣博盛生物为您总结了一些关键的准备工作步骤: 1. 阅读说明书 仔细阅读ELISA试剂盒的说明书,了解试剂…...
浅谈 Linux 中的 core dump 分析方法
文章目录 一、什么是 core dump二、发生 core dump 的原因1. 空指针或非法指针引起 core dump2. 数组越界或指针越界引起的 core dump3. 数据竞争导致 core dump4. 代码不规范 三、core dump 分析方法1. 启用 core dump2. 触发 core dump2-1. 因空指针解引用而崩溃2-2. 通过 SI…...
自研直播系统-直播系统实战
文章目录 1 流媒体基础本文教程下载地址1.1 流媒体1.2 流式传输方式1.2.1 顺序流式传输1.2.2 实时流式传输 1.3 流媒体传输协议1.3.1 rtmp协议1.3.2 HLS协议1.3.3 RTSP协议1.3.4 视频流的对比 1.4 视频编码(codec)1.5 分辨率的规范分辨率簡介:1.5.2 分辨率單位 1.6 …...
python数据分析入门学习笔记
目录 一、 数据分析有关的python库简介 (一)numpy (二)pandas (三)matplotlib (四)scipy (五)statsmodels (六)scikit-learn 二、 数据的导入和导出 三、 数据筛选 四、 数据描述 五、 数据处理 六、 统计分析 七、 可视化 八、 其它是编译过程中的一个阶段,它在编译器进行实际编译之前对源代码进行处理。预处理器提供了一系列的指令,用于条件编译、文件包含、宏定义等操作。以下是一些常见的预处理器指令: 宏定义ÿ…...
MySQL—创建查看删除备份恢复数据库
创建数据库 创建数据库 LLF_DB01CREATE DATABASE LLF_DB01删除数据库DROP DATABASE LLF_DB01创建一个使用utf8字符集的数据库并带校对规则的数据库CREATE DATABASE hsp_db03 CHARACTER SET utf8 COLLATE utf8_bin 查看、删除数据库 显示所有的数据库SHOW DATABASES显示数据库…...
1.4 ROS2集成开发环境搭建
1.4.1 安装VSCode VSCode全称Visual Studio Code,是微软推出的一款轻量级代码编辑器,免费、开源而且功能强大。它支持几乎所有主流的程序语言的语法高亮、智能代码补全、自定义热键、括号匹配、代码片段、代码对比Diff、GIT 等特性,支持插件…...
数组和对象在内存中的区别
一、内存分配方式 数组在内存中是一段连续的存储空间,每个元素占据一个位置,这种连续存储方式使得数组的访问速度更快。对象在内存中是以键值对的形式存储的,每个键值对都需要单独的内存空间,这种非连续的存储方式可能会导致访问…...
智能胎教仪,科技与教育的融合-N9301胎教仪语音方案
随着科学技术的不断进步,人们对婴幼儿教育的认知也日趋成熟和全面。其中,胎教作为一种重要的早期教育方式,近年来备受瞩目。而胎教仪语音芯片的研发,正是为了满足这一需求,为胎儿的健康成长提供更加便捷的胎教方案。 一…...
代码随想录2链表
2 移除元素 Leetcode203 设置虚拟头节点 dummyHead...
Java8新特性常见用法
Java8新特性 示例类Stream API 使用示例forEach:遍历Stream:创建流map:转换元素filter:过滤元素collect(收集元素) 和 Collectors(分组、连接)sorted 和 comparing(搭配排序)toMap:转换Map元素collectingAndThen:过滤掉相同数据toUpperCase:转大写distinct:去重c…...
Web3 前端攻击:原因、影响及经验教训
DeFi的崛起引领了一个创新和金融自由的新时代。然而,这种快速增长也吸引了恶意行为者的注意,他们试图利用漏洞进行攻击。尽管很多焦点都集中在智能合约安全上,但前端攻击也正在成为一个重要的威胁向量。 前端攻击的剖析 理解攻击者利用前端漏…...
C++ 如何解决回调地狱问题
“地狱回调”(Callback Hell)是指在编程中使用过多嵌套回调函数,导致代码难以阅读和维护。C 提供了多种方法来解决这个问题,包括以下几种常见的方法: 使用 Lambda 表达式和标准库的 std::function使用 std::future 和…...
C++:std::is_convertible
C++标志库中提供is_convertible,可以测试一种类型是否可以转换为另一只类型: template <class From, class To> struct is_convertible; 使用举例: #include <iostream> #include <string>using namespace std;struct A { }; struct B : A { };int main…...
Unity3D中Gfx.WaitForPresent优化方案
前言 在Unity中,Gfx.WaitForPresent占用CPU过高通常表示主线程在等待GPU完成渲染(即CPU被阻塞),这表明存在GPU瓶颈或垂直同步/帧率设置问题。以下是系统的优化方案: 对惹,这里有一个游戏开发交流小组&…...
【Redis技术进阶之路】「原理分析系列开篇」分析客户端和服务端网络诵信交互实现(服务端执行命令请求的过程 - 初始化服务器)
服务端执行命令请求的过程 【专栏简介】【技术大纲】【专栏目标】【目标人群】1. Redis爱好者与社区成员2. 后端开发和系统架构师3. 计算机专业的本科生及研究生 初始化服务器1. 初始化服务器状态结构初始化RedisServer变量 2. 加载相关系统配置和用户配置参数定制化配置参数案…...
屋顶变身“发电站” ,中天合创屋面分布式光伏发电项目顺利并网!
5月28日,中天合创屋面分布式光伏发电项目顺利并网发电,该项目位于内蒙古自治区鄂尔多斯市乌审旗,项目利用中天合创聚乙烯、聚丙烯仓库屋面作为场地建设光伏电站,总装机容量为9.96MWp。 项目投运后,每年可节约标煤3670…...
leetcodeSQL解题:3564. 季节性销售分析
leetcodeSQL解题:3564. 季节性销售分析 题目: 表:sales ---------------------- | Column Name | Type | ---------------------- | sale_id | int | | product_id | int | | sale_date | date | | quantity | int | | price | decimal | -…...
OPenCV CUDA模块图像处理-----对图像执行 均值漂移滤波(Mean Shift Filtering)函数meanShiftFiltering()
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 在 GPU 上对图像执行 均值漂移滤波(Mean Shift Filtering),用于图像分割或平滑处理。 该函数将输入图像中的…...
Hive 存储格式深度解析:从 TextFile 到 ORC,如何选对数据存储方案?
在大数据处理领域,Hive 作为 Hadoop 生态中重要的数据仓库工具,其存储格式的选择直接影响数据存储成本、查询效率和计算资源消耗。面对 TextFile、SequenceFile、Parquet、RCFile、ORC 等多种存储格式,很多开发者常常陷入选择困境。本文将从底…...
【7色560页】职场可视化逻辑图高级数据分析PPT模版
7种色调职场工作汇报PPT,橙蓝、黑红、红蓝、蓝橙灰、浅蓝、浅绿、深蓝七种色调模版 【7色560页】职场可视化逻辑图高级数据分析PPT模版:职场可视化逻辑图分析PPT模版https://pan.quark.cn/s/78aeabbd92d1...
Yolov8 目标检测蒸馏学习记录
yolov8系列模型蒸馏基本流程,代码下载:这里本人提交了一个demo:djdll/Yolov8_Distillation: Yolov8轻量化_蒸馏代码实现 在轻量化模型设计中,**知识蒸馏(Knowledge Distillation)**被广泛应用,作为提升模型…...
上位机开发过程中的设计模式体会(1):工厂方法模式、单例模式和生成器模式
简介 在我的 QT/C 开发工作中,合理运用设计模式极大地提高了代码的可维护性和可扩展性。本文将分享我在实际项目中应用的三种创造型模式:工厂方法模式、单例模式和生成器模式。 1. 工厂模式 (Factory Pattern) 应用场景 在我的 QT 项目中曾经有一个需…...
