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 和…...
调用支付宝接口响应40004 SYSTEM_ERROR问题排查
在对接支付宝API的时候,遇到了一些问题,记录一下排查过程。 Body:{"datadigital_fincloud_generalsaas_face_certify_initialize_response":{"msg":"Business Failed","code":"40004","sub_msg…...
树莓派超全系列教程文档--(62)使用rpicam-app通过网络流式传输视频
使用rpicam-app通过网络流式传输视频 使用 rpicam-app 通过网络流式传输视频UDPTCPRTSPlibavGStreamerRTPlibcamerasrc GStreamer 元素 文章来源: http://raspberry.dns8844.cn/documentation 原文网址 使用 rpicam-app 通过网络流式传输视频 本节介绍来自 rpica…...
【网络安全产品大调研系列】2. 体验漏洞扫描
前言 2023 年漏洞扫描服务市场规模预计为 3.06(十亿美元)。漏洞扫描服务市场行业预计将从 2024 年的 3.48(十亿美元)增长到 2032 年的 9.54(十亿美元)。预测期内漏洞扫描服务市场 CAGR(增长率&…...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院查看报告小程序
一、开发环境准备 工具安装: 下载安装DevEco Studio 4.0(支持HarmonyOS 5)配置HarmonyOS SDK 5.0确保Node.js版本≥14 项目初始化: ohpm init harmony/hospital-report-app 二、核心功能模块实现 1. 报告列表…...
【AI学习】三、AI算法中的向量
在人工智能(AI)算法中,向量(Vector)是一种将现实世界中的数据(如图像、文本、音频等)转化为计算机可处理的数值型特征表示的工具。它是连接人类认知(如语义、视觉特征)与…...
Module Federation 和 Native Federation 的比较
前言 Module Federation 是 Webpack 5 引入的微前端架构方案,允许不同独立构建的应用在运行时动态共享模块。 Native Federation 是 Angular 官方基于 Module Federation 理念实现的专为 Angular 优化的微前端方案。 概念解析 Module Federation (模块联邦) Modul…...
【Zephyr 系列 10】实战项目:打造一个蓝牙传感器终端 + 网关系统(完整架构与全栈实现)
🧠关键词:Zephyr、BLE、终端、网关、广播、连接、传感器、数据采集、低功耗、系统集成 📌目标读者:希望基于 Zephyr 构建 BLE 系统架构、实现终端与网关协作、具备产品交付能力的开发者 📊篇幅字数:约 5200 字 ✨ 项目总览 在物联网实际项目中,**“终端 + 网关”**是…...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个生活电费的缴纳和查询小程序
一、项目初始化与配置 1. 创建项目 ohpm init harmony/utility-payment-app 2. 配置权限 // module.json5 {"requestPermissions": [{"name": "ohos.permission.INTERNET"},{"name": "ohos.permission.GET_NETWORK_INFO"…...
Java入门学习详细版(一)
大家好,Java 学习是一个系统学习的过程,核心原则就是“理论 实践 坚持”,并且需循序渐进,不可过于着急,本篇文章推出的这份详细入门学习资料将带大家从零基础开始,逐步掌握 Java 的核心概念和编程技能。 …...
uniapp中使用aixos 报错
问题: 在uniapp中使用aixos,运行后报如下错误: AxiosError: There is no suitable adapter to dispatch the request since : - adapter xhr is not supported by the environment - adapter http is not available in the build 解决方案&…...
