【大前端】ECharts 绘制立体柱状图

devtools/2024/10/21 10:03:04/

立体柱状图分为:

  1. 纯色立体柱状图
  2. 渐变立体柱状图

常用实现方式

纯色立体柱状图

纯色立体柱状图,使用MarkPoint和颜色渐变就实现,如下代码

在这里插入图片描述

import * as echarts from "echarts";var chartDom = document.getElementById("main");
var myChart = echarts.init(chartDom, "dark");
var option;const xAxisData = ['A', 'B', 'C', 'D', 'E'];
const yAxisData = [10, 20, 30, 50, 60];const markPointData = [];const barWidth = 30;const linearColor = {type: 'linear',x: 0,y: 0,x1: 0,y1: 1,colorStops: [{offset: 0,color: '#28A9A2' // 0% 处的颜色},{offset: 0.5,color: '#28A9A2' // 0% 处的颜色},{offset: 0.5,color: '#35FFF4' // 0% 处的颜色},{offset: 1,color: '#35FFF4' // 100% 处的颜色}],global: false // 缺省为 false
};yAxisData.forEach((v, i) => {//添加顶部渐变markPointData.push({xAxis: xAxisData[i],yAxis: v,symbol: 'path://M 0 5 L 15 10 L 30 5 L 15 0 L 0 5 Z', //菱形图标symbolSize: [barWidth, barWidth * 0.5],itemStyle: {color: 'rgba(126, 255, 248,1)'}});// //添加底部渐变markPointData.push({xAxis: xAxisData[i],y: 698,// 到左上角Y轴距离symbol: 'path://M 0 5 L 15 10 L 30 5 L 15 0 L 0 5 Z', //菱形图标symbolSize: [barWidth, barWidth * 0.5],symbolOffset: ['0%', '100%'],itemStyle: {color: linearColor}});
});option = {title: {text: '立体柱状图示例'},tooltip: {},xAxis: {data: xAxisData},yAxis: {},series: [{name: '销量',type: 'bar',data: yAxisData,barWidth: barWidth,markPoint: {data: markPointData,silent: true},itemStyle: {borderRadius: [0, 0, 30, 30],color: linearColor}}]
};option && myChart.setOption(option);

SVG

SVG适用于纯色立体柱状图和渐变立体柱状图

ECharts不能直接使用SVG字符串,须要转化为Base64格式的数据(可以使用网络SVG图片地址)

在这里插入图片描述

import * as echarts from "echarts";var chartDom = document.getElementById("main");
var myChart = echarts.init(chartDom, "dark");
var option;const xAxisData = ["A", "B", "C", "D", "E"];
const yAxisData = [10, 20, 30, 50, 60];const markPointData = [];const barWidth = 30;const svgStr ='<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" fill="none" version="1.1" width="14" height="105" viewBox="0 0 14 105"><defs><linearGradient x1="0.5" y1="0" x2="0.5" y2="1" id="master_svg0_1_6290"><stop offset="0%" stop-color="#28A9A2" stop-opacity="1"/><stop offset="100%" stop-color="#28A9A2" stop-opacity="0"/></linearGradient><linearGradient x1="0.5" y1="0" x2="0.5" y2="1" id="master_svg1_1_6296"><stop offset="0%" stop-color="#35FFF4" stop-opacity="1"/><stop offset="100%" stop-color="#35FFF4" stop-opacity="0"/></linearGradient></defs><g><g><rect x="0" y="0" width="7" height="105" rx="0" fill="url(#master_svg0_1_6290)" fill-opacity="1"/></g><g><rect x="7" y="0" width="7" height="105" rx="0" fill="url(#master_svg1_1_6296)" fill-opacity="1"/></g></g></svg>';
// 转换为Base64格式
const svgDataURL = "data:image/svg+xml;base64," + btoa(svgStr);yAxisData.forEach((v, i) => {//添加顶部渐变markPointData.push({xAxis: xAxisData[i],yAxis: v,symbol: "path://M 0 5 L 15 10 L 30 5 L 15 0 L 0 5 Z", //菱形图标symbolSize: [barWidth, barWidth * 0.5],itemStyle: {color: "rgba(126, 255, 248,1)"}});
});option = {title: {text: "立体柱状图示例"},tooltip: {},xAxis: {data: xAxisData},yAxis: {},series: [{name: "销量",type: "pictorialBar",data: yAxisData,barWidth: barWidth,markPoint: {data: markPointData,silent: true},symbol:`image://${svgDataURL}`,}]
};option && myChart.setOption(option);

2. MarkPoint

MarkPoint 适用于多组图标组合展示

它和SVG不同的是绘制方式不一样,SVG是互联网通用绘制方式,MarkPoint是ECharts特有的绘制方式

在这里插入图片描述

import * as echarts from 'echarts';var chartDom = document.getElementById('main');
var myChart = echarts.init(chartDom, 'dark');
var option;const xAxisData = ['A', 'B', 'C', 'D', 'E'];
const yAxisData = [10, 20, 30, 50, 60];const markPointData = [];const barWidth = 30;// 计算柱状图高度
function computedBarHeight(value, params) {// 左上角 到 Y轴 0 刻度的高度,如果x轴是数值轴,则例使用xAxisIndex标记const zeroHeight = myChart.convertToPixel({ yAxisIndex: 0 }, 0);// 左上角到Y轴目标数值的高度,如果x轴是数值轴,则例使用xAxisIndex标记const height = myChart.convertToPixel({ yAxisIndex: 0 }, params.data.yAxis);// 返回柱状图大小,高度等于0刻度距离-目标数值距离的差值return [barWidth / 2, zeroHeight - height];
}yAxisData.forEach((v, i) => {//添加左侧渐变markPointData.push({xAxis: xAxisData[i],yAxis: v,symbol: 'rect',symbolSize: computedBarHeight,symbolOffset: ['-50%', '50%'],itemStyle: {color: {type: 'linear',x: 0,y: 0,x2: 0,y2: 1,colorStops: [{offset: 0,color: 'rgba(40, 169, 162,1)'},{offset: 1,color: 'rgba(40, 169, 162,0)'}],global: false}}});//添加右侧渐变markPointData.push({xAxis: xAxisData[i],yAxis: v,symbol: 'rect',symbolSize: computedBarHeight,symbolOffset: ['50%', '50%'],itemStyle: {color: {type: 'linear',x: 0,y: 0,x2: 0,y2: 1,colorStops: [{offset: 0,color: 'rgba(53, 255, 244,1)'},{offset: 1,color: 'rgba(53, 255, 244,0)'}],global: false}}});//添加顶部渐变markPointData.push({xAxis: xAxisData[i],yAxis: v,symbol: 'path://M 0 5 L 15 10 L 30 5 L 15 0 L 0 5 Z',//菱形图标symbolSize: [barWidth, barWidth * 0.5],itemStyle: {color: 'rgba(126, 255, 248,1)'}});
});option = {title: {text: '立体柱状图示例'},tooltip: {},xAxis: {data: xAxisData},yAxis: {},series: [{name: '销量',type: 'bar',data: yAxisData,barWidth: barWidth,markPoint: {data: markPointData,silent: true},z: 3,itemStyle: {color: 'rgba(255, 53, 64,0)'}}]
};option && myChart.setOption(option);

http://www.ppmy.cn/devtools/27451.html

相关文章

【docker】Docker开启远程访问

将构建的镜像自动上传到服务器。 需要开放 Docker 的端口&#xff0c;让我们在本地能连接上服务器的 Docker&#xff0c;这样&#xff0c;才能上传构建的镜像给 Docker。 开启远程访问 首先在服务器打开 Docker 的服务文件 vim /usr/lib/systemd/system/docker.service修改…

在 Python 中使用 PyPDF2 向 PDF 文件批量添加水印

目录&#xff1a; 使用 PyPDF2 添加水印到 PDF 文件批量添加水印到 PDF 文件所有页 PDF 文件广泛用于不同的设备和平台上&#xff0c;在某些情况下&#xff0c;可能需要在 PDF 文件中申明版权&#xff0c;需要将水印、条形码、二维码等添加到 PDF 中。PyPDF2 提供了一种将另一个…

面试笔记——多线程使用场景

线程池使用场景&#xff08;CountDownLatch&#xff0c; Future&#xff09; CountDownLatch CountDownLatch&#xff08;闭锁/倒计时锁&#xff09;用来进行线程同步协作&#xff0c;等待所有线程完成倒计时&#xff08;一个或者多个线程&#xff0c;等待其他多个线程完成某件…

k8s中deployment和StatefulSet构建的pod的区别

在Kubernetes中&#xff0c;Deployment和StatefulSet都是控制器对象&#xff0c;用于管理和扩展应用程序的Pod。它们之间的主要区别在于它们处理Pod的方式和适用的应用程序类型。 以下是Deployment和StatefulSet之间的主要区别&#xff1a; 有状态应用程序 vs 无状态应用程序&…

【Go 语言入门专栏】Go 语言的起源与发展

前言 Go 语言是当下最为流行的编程语言之一&#xff0c;大约在 2020、2021 年左右开始于国内盛行&#xff0c;许多大厂很早就将部分 Java 项目迁移到了 Go&#xff0c;足可看出其在性能方面的优越性。 相信各位都知道&#xff0c;在爬虫业务中&#xff0c;并发是一个关键的需…

Open CASCADE学习|GeomFill_CurveAndTrihedron

GeomFill_CurveAndTrihedron类是GeomFill_LocationLaw的子类&#xff0c;用于定义一个位置法则&#xff08;Location Law&#xff09;&#xff0c;该法则结合了一个曲线&#xff08;curve&#xff09;和一个三面体法则&#xff08;TrihedronLaw&#xff09;。 类功能&#xff…

【AIGC调研系列】InternVL开源多模态模型与GPT-4V的性能对比

InternVL和GPT-4V都是多模态模型&#xff0c;但它们在性能、参数量以及应用领域上有所不同。 InternVL是一个开源的多模态模型&#xff0c;其参数量为60亿&#xff0c;覆盖了图像/视频分类、检索等关键任务&#xff0c;并在32个视觉-语言基准测试中展现了卓越性能[2]。InternV…

python实现的基于单向循环链表插入排序

相比于定义一个循环双向链表来实现插入排序来说&#xff0c;下面的实现采用一个单向循环链表来实现&#xff0c;并且不需要定义一个单向循环链表类&#xff0c;而是把一个list&#xff08;数组/顺序表&#xff09;当成单向循环链表来用&#xff0c;list的元素是一个包含两个元素…