当前位置: 首页 > news >正文

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柱状图,支持渐变

留档&#xff0c;以防忘记 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.什么是伪元素 伪元素不是真正的页面元素&#xff0c;html没有对应的元素&#xff0c;但是其所有用法和表现行为与真正的页面元素一样&#xff0c;可以对其使用如页面元素一样的CSS样式&#xff0c;表面上看上去貌似是页面的某些元素来展现&#xff0c;实际上CSS样式展现的行…...

下载后端返回的图片,而不是打开图片

使用 window.location.href 和 window.open 后都是打开图片&#xff0c;原因是&#xff0c;当浏览器发现是浏览器支持的文件类型&#xff0c;例如 jpg、png、svg 等&#xff0c;默认是浏览器打开。 解决 fetch createObjectURL fetch 转换为 blob 对象 createObjectURL() 静…...

ELISA实验前,需要做好哪些准备?

进行ELISA试剂盒实验前&#xff0c;需要进行周密的准备工作以确保实验的顺利进行和实验的准确性。那么&#xff0c;具体应该做哪些准备呢&#xff1f;欣博盛生物为您总结了一些关键的准备工作步骤&#xff1a; 1. 阅读说明书 仔细阅读ELISA试剂盒的说明书&#xff0c;了解试剂…...

浅谈 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 分辨率的规范分辨率簡介&#xff1a;1.5.2 分辨率單位 1.6 …...

python数据分析入门学习笔记

目录 一、 数据分析有关的python库简介 (一)numpy (二)pandas (三)matplotlib (四)scipy (五)statsmodels (六)scikit-learn 二、 数据的导入和导出 三、 数据筛选 四、 数据描述 五、 数据处理 六、 统计分析 七、 可视化 八、 其它![](https://…...

SyntaxError: invalid character in identifier 解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…...

装箱问题汇总

一维装箱 整数规划建模 参考 二维装箱 数学建模 参考1 参考2...

你的B端系统考虑移动化了?还没?那就小心out了。

B端系统移动化的趋势是不可阻挡的。随着移动设备的普及和移动互联网的发展&#xff0c;越来越多的企业和组织意识到移动化对于提高工作效率、拓展市场和提供更好的用户体验的重要性。以下是一些导致B端系统移动化趋势不可阻挡的原因&#xff1a; 移动办公需求&#xff1a;越来越…...

大数据招商的应用场景及实施路径有哪些?

当下&#xff0c;我国已经进入数字经济与实体经济融合发展的新阶段&#xff0c;数字技术和数字化转型落地日臻成熟&#xff0c;数据要素价值释放深入到了我国各个领域的发展&#xff0c;招商引资也不例外&#xff0c;在传统招商模式效果日渐甚微的大环境下&#xff0c;大数据招…...

【C++】 C/C++预处理器介绍

C预处理器&#xff08;Preprocessor&#xff09;是编译过程中的一个阶段&#xff0c;它在编译器进行实际编译之前对源代码进行处理。预处理器提供了一系列的指令&#xff0c;用于条件编译、文件包含、宏定义等操作。以下是一些常见的预处理器指令&#xff1a; 宏定义&#xff…...

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&#xff0c;是微软推出的一款轻量级代码编辑器&#xff0c;免费、开源而且功能强大。它支持几乎所有主流的程序语言的语法高亮、智能代码补全、自定义热键、括号匹配、代码片段、代码对比Diff、GIT 等特性&#xff0c;支持插件…...

数组和对象在内存中的区别

一、内存分配方式 数组在内存中是一段连续的存储空间&#xff0c;每个元素占据一个位置&#xff0c;这种连续存储方式使得数组的访问速度更快。对象在内存中是以键值对的形式存储的&#xff0c;每个键值对都需要单独的内存空间&#xff0c;这种非连续的存储方式可能会导致访问…...

智能胎教仪,科技与教育的融合-N9301胎教仪语音方案

随着科学技术的不断进步&#xff0c;人们对婴幼儿教育的认知也日趋成熟和全面。其中&#xff0c;胎教作为一种重要的早期教育方式&#xff0c;近年来备受瞩目。而胎教仪语音芯片的研发&#xff0c;正是为了满足这一需求&#xff0c;为胎儿的健康成长提供更加便捷的胎教方案。 一…...

代码随想录2链表

2 移除元素 Leetcode203 设置虚拟头节点 dummyHead...

Java8新特性常见用法

Java8新特性 示例类Stream API 使用示例forEach:遍历Stream:创建流map:转换元素filter:过滤元素collect(收集元素) 和 Collectors(分组、连接)sorted 和 comparing(搭配排序)toMap:转换Map元素collectingAndThen:过滤掉相同数据toUpperCase:转大写distinct:去重c…...

Web3 前端攻击:原因、影响及经验教训

DeFi的崛起引领了一个创新和金融自由的新时代。然而&#xff0c;这种快速增长也吸引了恶意行为者的注意&#xff0c;他们试图利用漏洞进行攻击。尽管很多焦点都集中在智能合约安全上&#xff0c;但前端攻击也正在成为一个重要的威胁向量。 前端攻击的剖析 理解攻击者利用前端漏…...

C++ 如何解决回调地狱问题

“地狱回调”&#xff08;Callback Hell&#xff09;是指在编程中使用过多嵌套回调函数&#xff0c;导致代码难以阅读和维护。C 提供了多种方法来解决这个问题&#xff0c;包括以下几种常见的方法&#xff1a; 使用 Lambda 表达式和标准库的 std::function使用 std::future 和…...

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…...

CTF show Web 红包题第六弹

提示 1.不是SQL注入 2.需要找关键源码 思路 进入页面发现是一个登录框&#xff0c;很难让人不联想到SQL注入&#xff0c;但提示都说了不是SQL注入&#xff0c;所以就不往这方面想了 ​ 先查看一下网页源码&#xff0c;发现一段JavaScript代码&#xff0c;有一个关键类ctfs…...

STM32标准库-DMA直接存储器存取

文章目录 一、DMA1.1简介1.2存储器映像1.3DMA框图1.4DMA基本结构1.5DMA请求1.6数据宽度与对齐1.7数据转运DMA1.8ADC扫描模式DMA 二、数据转运DMA2.1接线图2.2代码2.3相关API 一、DMA 1.1简介 DMA&#xff08;Direct Memory Access&#xff09;直接存储器存取 DMA可以提供外设…...

在鸿蒙HarmonyOS 5中使用DevEco Studio实现录音机应用

1. 项目配置与权限设置 1.1 配置module.json5 {"module": {"requestPermissions": [{"name": "ohos.permission.MICROPHONE","reason": "录音需要麦克风权限"},{"name": "ohos.permission.WRITE…...

Angular微前端架构:Module Federation + ngx-build-plus (Webpack)

以下是一个完整的 Angular 微前端示例&#xff0c;其中使用的是 Module Federation 和 npx-build-plus 实现了主应用&#xff08;Shell&#xff09;与子应用&#xff08;Remote&#xff09;的集成。 &#x1f6e0;️ 项目结构 angular-mf/ ├── shell-app/ # 主应用&…...

JAVA后端开发——多租户

数据隔离是多租户系统中的核心概念&#xff0c;确保一个租户&#xff08;在这个系统中可能是一个公司或一个独立的客户&#xff09;的数据对其他租户是不可见的。在 RuoYi 框架&#xff08;您当前项目所使用的基础框架&#xff09;中&#xff0c;这通常是通过在数据表中增加一个…...

LeetCode - 199. 二叉树的右视图

题目 199. 二叉树的右视图 - 力扣&#xff08;LeetCode&#xff09; 思路 右视图是指从树的右侧看&#xff0c;对于每一层&#xff0c;只能看到该层最右边的节点。实现思路是&#xff1a; 使用深度优先搜索(DFS)按照"根-右-左"的顺序遍历树记录每个节点的深度对于…...

CVE-2020-17519源码分析与漏洞复现(Flink 任意文件读取)

漏洞概览 漏洞名称&#xff1a;Apache Flink REST API 任意文件读取漏洞CVE编号&#xff1a;CVE-2020-17519CVSS评分&#xff1a;7.5影响版本&#xff1a;Apache Flink 1.11.0、1.11.1、1.11.2修复版本&#xff1a;≥ 1.11.3 或 ≥ 1.12.0漏洞类型&#xff1a;路径遍历&#x…...

【Linux】Linux 系统默认的目录及作用说明

博主介绍&#xff1a;✌全网粉丝23W&#xff0c;CSDN博客专家、Java领域优质创作者&#xff0c;掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域✌ 技术范围&#xff1a;SpringBoot、SpringCloud、Vue、SSM、HTML、Nodejs、Python、MySQL、PostgreSQL、大数据、物…...

解析两阶段提交与三阶段提交的核心差异及MySQL实现方案

引言 在分布式系统的事务处理中&#xff0c;如何保障跨节点数据操作的一致性始终是核心挑战。经典的两阶段提交协议&#xff08;2PC&#xff09;通过准备阶段与提交阶段的协调机制&#xff0c;以同步决策模式确保事务原子性。其改进版本三阶段提交协议&#xff08;3PC&#xf…...