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?: boolean
    labelColor?: string
    labelFont?: number
    offsetTop?: 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} />

效果

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

HTML总结2

什么是HTML HTML&#xff08;Hypertext Markup Language&#xff09;&#xff0c;超文本标记语言&#xff0c;&#xff08;是一套标记标签&#xff0c;一般用来描述网页&#xff09;。 HTML标签 HTML标记标签&#xff0c;通常被称为HTML标签&#xff0c;或者HTML标记。 标签…

VScode使用ssh连接服务器

VScode是一款有丰富插件的编译器&#xff0c;非常好用&#xff01;除非你不会用&#xff0c;因为太过繁琐或着频繁出错导致想把电脑砸了&#xff1b; 插件选择 ssh 配置文件 Host myblablaHostName xxx.xx.xxx.xxxUser username用户名一般是服务器上创建有什么用户名&#xf…

【STM32】在标准库中使用DMA

1.MDA简介 DMA全称Direct Memory Access,直接存储区访问。 DMA传输将数据从一个地址空间复制到另一个地址空间。当CPU初始化这个传输动作&#xff0c;传输动作本身是由DMA控制器来实现和完成的。DMA传输方式无需CPU直接控制传输&#xff0c;也没有中断处理方式那样保留现场和…

seq2seq+Attention机制原理介绍

一、Seq2seq的局限性 Seq2seq&#xff08;序列到序列&#xff09;模型我们在前面讲了它的原理&#xff0c;是一种广泛用于处理序列转换任务的深度学习架构&#xff0c;特别是在机器翻译、文本摘要、对话生成等应用中。然而&#xff0c;尽管seq2seq模型在某些领域取得了显著的成…

使用 Python2.7 抓取 systrace 文件

为了排查安卓终端系统底层问题&#xff0c;需要抓取终端的systrace文件分析&#xff0c;下面是操作步骤&#xff1a; 1、安装python 2.7 2、打开cmd执行命令安装python包&#xff1a;pip install pypiwin32 3、解压six-1.16.0.tar.gz&#xff0c;进入目录用命令安装six&#xf…

《UDS协议从入门到精通》系列——图解0x84:安全数据传输

《UDS协议从入门到精通》系列——图解0x84&#xff1a;安全数据传输 一、简介二、数据包格式2.1 服务请求格式2.2 服务响应格式2.2.1 肯定响应2.2.2 否定响应 Tip&#x1f4cc;&#xff1a;本文描述中但凡涉及到其他UDS服务的&#xff0c;均提供专栏内文章链接跳转方式以便快速…

Stable Diffusion最强功能—— 图片背景完美替换

今天分享 Stable Diffusion 图片背景完美替换 功能&#xff0c;通过 Stable Diffusion 图生图重绘蒙版进行背景图的二次重绘。 在广告产品图、头像背景替换、图片后期处理等场景下用到的都很频繁。 整体步骤&#xff1a; 通过 removebg 插件实现图片主体蒙版的抠图 结合图生…

提升研发效能的67个技术点丨IDCF

在当今快速变化的市场环境中&#xff0c;企业要想保持竞争力&#xff0c;就必须不断提高研发效率。高效的研发不仅能够帮助企业快速响应市场需求&#xff0c;还能降低成本、提高产品质量。本文让我们一起来看一下&#xff0c;作为微软18年MVP的技术大咖徐磊老师&#xff0c;梳理…

HTML CSS 基础复习笔记 - 列表使用

用于自己复习 自定义列表 示例代码 <!DOCTYPE html> <html> <head><title>Definition List Example</title> </head> <body><h1>古诗</h1><dl><dt>静夜思</dt><dd>床前明月光&#xff0c;疑…

使用dot来画流程图

Dot是一种图形描述语言&#xff0c;属于Graphviz软件的一部分。Graphviz是一个用于可视化图形&#xff08;图表、网络图等&#xff09;的开源工具集。使用Dot语言&#xff0c;你可以创建并描述节点和边&#xff0c;从而生成图形。以下是如何使用Dot语言画图的基本步骤&#xff…

修复 OpenSSH 爆出极其严重的安全漏洞!

最近几天OpenSSH爆出了一个高危漏洞&#xff1a;CVE-2024-6387&#xff0c;影响到了很多的Linux服务器系统。明月第一时间给所有的代维客户服务器进行了排查和漏洞修复&#xff0c;因此耽搁了一些时间。直到今天才算抽出空来给大家分享一下。严格上来说这个漏洞的危险性还是极高…

Beyond Compare 解锁版下载及安装教程 (文件和文件夹比较工具)

前言 Beyond Compare 是一款功能强大的文件和文件夹比较工具。它支持文件夹比较、文件夹合并与同步、文本比较、表格比较、图片比较、16进制比较、注册表比较、版本比较等多种功能。通过 Beyond Compare&#xff0c;您可以轻松调查文件和文件夹之间的不同之处&#xff0c;并使…

MySQL篇-SQL优化实战-减少子查询

回顾 上一篇了解了分析SQL使用的explain&#xff0c;可以点击查看MySQL篇-SQL优化实战了解我在写sql的注意事项还有explain的说明&#xff0c;这次拿一段生产使用的sql进行优化说明。从14s优化到2.6s 待优化的SQL SELECT DISTINCTswpe.tag_number,hca.ACCOUNT_NAME customer…

ELFK简介

&#x1f468;‍&#x1f393;博主简介 &#x1f3c5;CSDN博客专家   &#x1f3c5;云计算领域优质创作者   &#x1f3c5;华为云开发者社区专家博主   &#x1f3c5;阿里云开发者社区专家博主 &#x1f48a;交流社区&#xff1a;运维交流社区 欢迎大家的加入&#xff01…

K8S学习教程(二):在 PetaExpress KubeSphere容器平台部署高可用 Redis 集群

前言 Redis 是在开发过程中经常用到的缓存中间件&#xff0c;为了考虑在生产环境中稳定性和高可用&#xff0c;Redis通常采用集群模式的部署方式。 在制定Redis集群的部署策略时&#xff0c;常规部署在虚拟机上的方式配置繁琐并且需要手动重启节点&#xff0c;相较之下&#…

java基础:方法

一、方法 1、Java方法是语句的集合&#xff0c;它们在一起执行一个功能。 方法是解决一类问题的步骤的有序集合方法包含于类或对象中方法在程序中被创建&#xff0c;在其他地方被引用 2、设计方法的原则&#xff1a;方法的本意是功能块&#xff0c;就是实现某个功能的语句块…

layui+jsp项目中实现table单元格嵌入下拉选择框功能,下拉选择框可手动输入内容或选择默认值,修改后数据正常回显。

需求 table列表中的数据实现下拉框修改数据&#xff0c;当默认的下拉框不符合要求时&#xff0c;可手动输入内容保存。内容修改后表格显示修改后的值同时表格不刷新。 实现 layui框架下拉框组件只能选择存在的数据&#xff0c;不支持将输入的内容显示在input中的功能&#x…

什么牌子的无线领夹麦克风好,一篇了解哪种领夹麦性价比高

随着5G技术的广泛应用&#xff0c;短视频平台迎来了前所未有的发展机遇&#xff0c;几乎每个地方都有人在记录生活&#xff0c;分享故事。在这样的背景下&#xff0c;户外直播和视频创作的需求急剧增长&#xff0c;然而&#xff0c;户外的复杂声场仅靠普通手机的录音功能实在难…

计算机网络之局域网

目录 1.局域网的基本概念 2.LAN的特性 3.局域网特点 4.拓扑结构 5.传输媒体的选择 6.传输媒体 7.传输技术 8.传输技术距离问题 9.LAN的逻辑结构 10.局域网工作原理 上篇文章内容&#xff1a;OSI七层体系结构 1.局域网的基本概念 局域网 是将分散在有限地 理范围内&…

Robust Test-Time Adaptation in Dynamic Scenarios--论文阅读

论文笔记 资料 1.代码地址 https://github.com/BIT-DA/RoTTA 2.论文地址 https://arxiv.org/abs/2303.13899 3.数据集地址 coming soon 1论文摘要的翻译 测试时间自适应(TTA)旨在使预先7训练的模型适用于仅具有未标记测试数据流的测试分布。大多数以前的TTA方法已经在…