ECharts 实战

news/2024/11/29 19:33:25/文章来源:https://www.cnblogs.com/lgx5/p/18577406

EChart 资源

Vue-EChart

不想封装 Echart, 可以选用这种方案。

Vue-ECharts 是一个 Vue 组件,旨在简化在 Vue 应用中集成 ECharts 的过程。它封装了 ECharts 的初始化和使用逻辑,用户只需要在 Vue 模板中添加组件并传递相应的 props,即可轻松创建图表。

支持Vue2 & Vue3 & Nuxt3

DOC: https://github.com/ecomfe/vue-echarts#readme

image

优点:

  1. Vue-ECharts 组件会自动处理 ECharts 实例的生命周期,能够根据 Vue 组件的状态变化自动更新图表。这使得代码更加简洁,易于维护。
  2. 通过 Vue 的数据绑定机制,可以直接将数据绑定到组件的 props 上,Vue-ECharts 会自动将数据变化应用到图表上。
  3. 作为 Vue 组件,可以很容易地与其他 Vue 组件组合,并且可以利用 Vue 的指令和事件系统。

EChart 配置生成 option

目前只有三种图表状态,可生成图片和JSON.

https://github.com/BruceHenry/chart-creator

image

EChart 速查手册 [官网]

https://echarts.apache.org/zh/cheat-sheet.html

image

EChart 主题配置 [官网]

https://echarts.apache.org/zh/theme-builder.html

image

EChart 社区示例 [社区,提供了大量的示例基本可以满足任何需求]

  1. MCChart

image

  1. isqqw

image

  1. MakeAPie

image

  1. PPChart

image

阅读导图

image

常用属性配置

title 标题配置

image

  1. text - 标题文本,例如 "柱状图"
  2. subtext- 副标题文本***
  3. *left 标题的水平位置,可以是像'left' 'center' 'right' 或者像'20%' 这样的百分比
  4. top*** **- 标题的垂直位置,可以是像** **'top',**** __'middle'__,__** __'bottom'__** __或者像**__** __'20%'__ __这样的百分比***
  5. textStyle*** **- 控制标题文本样式的对象,可以包括** ****color****,fontStylefontWeightfontFamily,*fontSize****** ****
  6. subtextStyle*** **- 控制副标题文本样式的对象,属性同** ****textStyle*
  7. textAlign*** **- 标题文本对齐,例如** **'left',**** __'right'__,**__** __'center'***
  8. padding*** **- 标题内边距,可以是数字或数组** ****[上, 右, 下, 左]*
  9. itemGap - 主副标题之间的间距
option = {title: {// 主标题文本设置text: '主标题文本',// 副标题文本设置subtext: '副标题文本',// 标题水平位置设置,'center' 表示居中left: 'center',// 标题垂直位置设置,'top' 表示顶部top: 'top',// 主标题样式设置,包括文字颜色、字体风格、字体粗细、字体族、字体大小
        textStyle: {color: 'black',      // 文字颜色fontStyle: 'normal', // 字体风格,'normal'表示普通样式fontWeight: 'bold',  // 字体粗细,'bold'表示加粗fontFamily: 'Arial', // 字体族,这里设置为ArialfontSize: 18,        // 字体大小,单位像素
        },// 副标题样式设置,属性同主标题textStyle
        subtextStyle: {color: '#aaa',       // 文字颜色fontStyle: 'normal', // 字体风格fontWeight: 'normal',// 字体粗细fontFamily: 'Arial', // 字体族fontSize: 12,        // 字体大小
        },// 标题文本对齐方式,'center' 表示居中对齐textAlign: 'center',// 标题内边距,第一个值表示上边距,第二个值表示右边距padding: [5, 10],// 主副标题之间的间距itemGap: 10},// 此处省略其他的图表配置选项…
};

 

tooltip 提示框

  1. formatter - 提示框浮层的内容格式器,支持字符串模板和回调函数两种形式
  2. axisPointer - 坐标轴指示器配置,指定其类型如 'line''shadow' 
  3. show - 是否显示提示框组件,包括提示框浮层和 axisPointer,默认为*** ***true
  4. backgroundColor - 提示框浮层的背景颜色
  5. borderColor - 提示框浮层的边框颜色
  6. borderWidth - 提示框浮层的边框宽
  7. padding - 提示框浮层内边距,可以是数字或数组 __[上, 右, 下, 左]**
// 工具提示配置
    tooltip: {// 触发类型,'item' 表示数据项图形触发,用于散点图等无类目轴的图表,'axis' 表示坐标轴触发,用于柱状图等有类目轴的图表trigger: 'axis',// 自定义提示框内容formatter: function (params) {// `params` 是一个数组,包含了当前鼠标所在点的所有数据信息let res = params[0].name + '<br>';params.forEach(function (item) {// 添加信息,这里只是个简单示例,具体格式可以自由配置res += item.seriesName + ': ' + item.value + '<br>';});return res;},// 坐标轴指示器配置
        axisPointer: {type: 'shadow' // 'line' 表示直线指示器,'shadow' 表示阴影指示器
        },// 控制浮层显示show: true,// 浮层背景颜色backgroundColor: 'rgba(50,50,50,0.7)',// 浮层边框颜色borderColor: '#333',// 浮层边框宽度borderWidth: 0,// 浮层内边距padding: 10 // 或者使用数组形式,例如 [5, 10, 5, 10]},
  1. formatter - 提示框浮层的内容格式器,支持字符串模板和回调函数两种形式
  2. axisPointer - 坐标轴指示器配置,指定其类型如 'line''shadow' 
  3. show - 是否显示提示框组件,包括提示框浮层和 axisPointer,默认为*** ***true
  4. backgroundColor - 提示框浮层的背景颜色
  5. borderColor - 提示框浮层的边框颜色
  6. borderWidth - 提示框浮层的边框宽
  7. padding - 提示框浮层内边距,可以是数字或数组 __[上, 右, 下, 左]**
// 工具提示配置
    tooltip: {// 触发类型,'item' 表示数据项图形触发,用于散点图等无类目轴的图表,'axis' 表示坐标轴触发,用于柱状图等有类目轴的图表trigger: 'axis',// 自定义提示框内容formatter: function (params) {// `params` 是一个数组,包含了当前鼠标所在点的所有数据信息let res = params[0].name + '<br>';params.forEach(function (item) {// 添加信息,这里只是个简单示例,具体格式可以自由配置res += item.seriesName + ': ' + item.value + '<br>';});return res;},// 坐标轴指示器配置
        axisPointer: {type: 'shadow' // 'line' 表示直线指示器,'shadow' 表示阴影指示器
        },// 控制浮层显示show: true,// 浮层背景颜色backgroundColor: 'rgba(50,50,50,0.7)',// 浮层边框颜色borderColor: '#333',// 浮层边框宽度borderWidth: 0,// 浮层内边距padding: 10 // 或者使用数组形式,例如 [5, 10, 5, 10]},

 

legend(图例组件)

image

图表的图例,表示不同系列的标识。

legend: {top: '5%',left: 'center',data: ['直接访问', '联盟广告', '搜索引擎']
} 

series(系列列表)

image

每个 series 代表一组数据项的集合,对于饼图配置的主要部分。

series 属性及其可能的值包括:

  • type: 'pie' // 必须设置为 'pie' 表示这是一个饼图。
  • radius: 半径,可以是百分比或固定像素值,也可以是数组形式表示内外半径。
  • center: Pie图的中心位置。
  • data: 数据项数组,每个数据项包括 value(数值)和 name(名称)。
  • stillShowZeroSum: 如果所有数据值都是0,是否显示图形。
  • label: 用于设置数据标签,如是否显示、位置、格式等。 
series: [{name: '访问来源',type: 'pie',radius: '50%', // 半径大小,支持百分比center: ['50%', '50%'], // 饼图的中心位置
        data: [{value: 335, name: '直接访问'},{value: 234, name: '联盟广告'},{value: 1548, name: '搜索引擎'}],emphasis: {itemStyle: {shadowBlur: 10,shadowOffsetX: 0,shadowColor: 'rgba(0, 0, 0, 0.5)'}},stillShowZeroSum: true,label: {normal: {show: true,position: 'outside' // 标签的位置
            },emphasis: {show: true,textStyle: {fontSize: '30',fontWeight: 'bold'}}}}
]

 

toolbox (工具栏配置)

image

color (配色方案)

image

定义颜色数组,用于系列中每个扇形的默认颜色:

--示例:
<font style="color:rgb(46, 50, 56);">['#5470C6', '#91CC75', '#FAC858', '#EE6666']</font>

 

animation (动画配置)

image

完整配置示例代码

option = {title: {// 饼图的标题text: 'Pie Chart Example'},tooltip: {// 鼠标悬浮时的提示框设置trigger: 'item' // item: 数据项图形触发
    },legend: {// 图例组件,展示不同系列的标识颜色和名称top: '5%',    // 距离容器上方的距离left: 'center', // 水平居中// 对应系列名称的数据data: ['Direct Visit', 'Union Ad', 'Search Engine']},toolbox: {show: true, // 显示工具栏
    feature: {saveAsImage: {}, // 保存为图片功能restore: {} // 还原功能
    }},series: [{// 系列名称,用于tooltip的显示name: 'Access From',type: 'pie', // 类型必须为饼图// 饼图的半径大小radius: '55%',// 饼图的中心(圆心)位置center: ['50%', '60%'],// 数据数组,包含每个扇区的大小和名称
            data: [{ value: 335, name: 'Direct Visit' },{ value: 234, name: 'Union Ad' },{ value: 1548, name: 'Search Engine' }],// 强调样式,当鼠标悬浮时显示阴影等效果
            emphasis: {itemStyle: {shadowBlur: 10, // 阴影的模糊大小shadowOffsetX: 0, // 阴影水平方向上的偏移距离shadowColor: 'rgba(0, 0, 0, 0.5)' // 阴影颜色
                }},// 标签的显示方式设定
            label: {normal: {// 常规状态下的标签显示设置show: true, // 是否展示标签position: 'outside', // 标签的位置// 标签的格式化器formatter: '{b}: {c} ({d}%)'},emphasis: {// 高亮状态下的文本样式定义show: true,textStyle: {fontSize: '30', // 字体大小fontWeight: 'bold' // 字体粗细
                    }}}}]
};

 

EChart 在 Vue3 中实战

// 图表实例的引用const chart = ref(null);// 初始化图表const initChart = () => {if (chart.value) {const myChart = echarts.init(chart.value); // 初始化 ECharts 实例myChart.setOption(props.option); // 设置配置项
    }};// 监听 props 的变化,动态更新图表
  watch(() => props.option,(newOption) => {if (chart.value) {const myChart = echarts.getInstanceByDom(chart.value); // 获取已初始化的图表实例myChart.setOption(newOption); // 更新配置项
      }});

 

响应式处理

图表在窗口大小变化时能够自动调整。可以使用 resize() 方法手动调整图表大小,通常是在 updated 生命周期钩子中调用。

// 响应式调整图表大小, 监听窗口大小变化,确保图表自适应容器的大小。
const resizeChart = () => {if (chart.value) {const myChart = echarts.getInstanceByDom(chart.value);myChart.resize(); // 调整图表尺寸
  }
};// 生命周期钩子
onMounted(() => {initChart(); // 组件挂载后初始化图表window.addEventListener('resize', resizeChart); // 监听窗口大小变化
});

 

动态数据更新

使用 Vue 的响应式数据(如 ref 或 reactive)配合 watch,在数据变化时调用 chart.setOption() 重新渲染图表。

const chartOption = ref({title: { text: '实时数据' },tooltip: { trigger: 'axis' },xAxis: { data: ['1', '2', '3', '4', '5'] },yAxis: {},series: [{name: '销量',type: 'line',data: [120, 132, 101, 134, 90]}]});watch(() => props.option,(newOption) => {if (chartInstance.value) {chartInstance.value.setOption(newOption); // 动态更新图表配置
    }},{ deep: true } // 深度监听
);chartOption.value.series[0].data.push(Math.random() * 100);
chartOption.value.xAxis.data.push(String(chartOption.value.xAxis.data.length + 1));

 

图表容器大小自适应

父容器尺寸发生变化时,图表可能不会自动调整大小。 我们可以通过 监听 resize 事件或使用 Vue 的响应式布局方案,调用 chart.resize() 更新图表尺寸。

const observer = new ResizeObserver(() => {chartInstance.value?.resize(); // 动态调整大小
});
observer.observe(containerElement); // 监听容器

国际化与多语言支持

图表中包含的文案(如标题、提示)需要支持多语言。 我们可以使用 Vue I18n 或其他国际化工具动态替换文本。

npm install vue-i18n
import { useI18n } from 'vue-i18n';const { t } = useI18n();
const option = reactive({title: { text: t('chart.title') },
});

ECharts 图表导出

toolbox: {feature: {saveAsImage: { show: true },},
};

性能优化

销毁 ECharts 实例

在组件销毁时,确保销毁 ECharts 实例,防止内存泄漏。

 onBeforeUnmount(() => {if (chart.value) {const myChart = echarts.getInstanceByDom(chart.value);myChart.dispose(); // 销毁 ECharts 实例
      }window.removeEventListener('resize', resizeChart); // 移除事件监听}); 

大数据渲染性能优化

数据量大时,ECharts 的渲染可能会导致性能瓶颈。 我们可以通过以下三种方式来达到优化作用

  • 使用 **dataZoom**: 允许用户缩放数据区域,减少可视数据点。
  • 启用分片渲染:
series: [{type: 'line',large: true, // 启用大数据优化largeThreshold: 4000, // 数据量门槛
  },
];
  • 降级动画: 动态数据场景中禁用或简化动画。
animation: false,
progressive: 4000, // 分步渲染
progressiveThreshold: 10000, // 数据点门槛

 

图表配置项太长,分离配置项

配置项代码过长,组件可读性降低。我们可以将配置项提取到单独的模块,便于复用和维护。

image

EChart 知识点常考

如何初始化和销毁 ECharts 实例?

  • echarts.init(dom) 初始化。
  • chart.dispose() 销毁实例,避免内存泄漏。

ECharts 常见配置项有哪些?

  • titlelegendtooltipgridxAxisyAxisseriestoolboxdataZoom

动态数据更新

- 如何实现图表数据的动态更新?
- 如何监听 `props` 变化并更新图表配置?

性能优化

- 大数据渲染场景如何优化?
- 什么是 `progressive` 渲染模式?

图表事件

- 如何捕获图表点击、悬停事件并执行对应的业务逻辑?

如何处理数据较多导致渲染卡顿的情况?

  • 使用数据分片渲染(progressive)。
  • 禁用动画。
  • 使用 dataZoom 限制显示范围。

如何实现图表导出功能?

使用 toolbox.feature.saveAsImage 或通过 chart.getDataURL() 获取图表数据并导出。

最后

通过对 ECharts 通用属性的深入提炼与系统整理,以及常用配置项的归纳总结,我们能够迅速实现图表的搭建与展示,极大地提升了开发效率。此外,借助丰富的 ECharts 资源和示例,我们基本上能够满足大部分业务场景的需求。这样一来,我们不仅能够更加快捷地实现功能需求,还能腾出更多宝贵的时间,专注于其他重要任务。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

腾讯云 AI 代码助手:单元测试应用实践

在软件开发这一充满创造性的领域中,开发人员不仅要构建功能强大的软件,还要确保这些软件的稳定性和可靠性。然而,开发过程中并非所有任务都能激发创造力,有些甚至是重复且乏味的。其中,编写单元测试无疑是最令人头疼的任务之一,它虽然对于验证软件组件是否按预期工作至关…

基于米尔全志T527开发板的FacenetPytorch人脸识别方案

本篇测评由优秀测评者“小火苗”提供。 本文将介绍基于米尔电子MYD-LT527开发板(米尔基于全志 T527开发板)的FacenetPytorch人脸识别方案测试。一、facenet_pytorch算法实现人脸识别 深度神经网络 1.简介 Facenet-PyTorch 是一个基于 PyTorch 框架实现的人脸识别库。它提供了…

Seata之小结和测试

目录一、本地事务二、分布式事务2.1、典型的分布式事务应用场景2.2、跨库事务2.3、分库分表2.4、微服务架构三、两阶段提交协议(2PC)2PC存在的问题四、Seata4.1、Seata的三大角色4.2、Seata AT模式的设计思路五、Seata快速开始Seata Server(TC)环境搭建步骤一:下载安装包步…

VS Code使用Git可视化管理源代码详细教程

思维导航前言 VS Code简介 环境准备 克隆GitHub中的存储库 查看当前所在分支 [*重要]实际工作开发四步曲(添,提,拉,推): 冲突解决 创建分支并推送到远程代码库 子分支开发完成后合并到主分支中VS Code Git提交修改历史记录查看(甩锅专用) 查看文件修改时间线对比文件修改…

二次函数+圆相结合的定值问题

来看一道初三接近5星难度的题目!高二圆锥曲线学到的定值问题与设而不求的方法,在初三压轴题中也会出现。专题:二次函数+圆 题型:动点问题+定值问题 难度系数:★★★★★ 【题目】 (24-25九年级湖北武汉)如图1,在平面直角坐标系$ xOy \(中,开口向…

2024-2025-1 20241401 《计算机基础与程序设计》 第十周学习总结

班级链接 2024计算机基础与程序设计作业要求 第十周作业作业目标 ①信息系统 ②数据库与SQL ③人工智能与专家系统 ④人工神经网络 ⑤模拟与离散事件 ⑥排队系统 ⑦天气与地震模型 ⑧图形图像教材学习内容总结 《计算机科学概论》第12、13、14章信息系统 信息系统: 帮助组织和…

数据结构查找

语雀链接:https://www.yuque.com/g/wushi-ls7km/ga9rkw/kl8h357ofcgocddz/collaborator/join?token=AwLuhwfJL8wLO2FH&source=doc_collaborator# 《数据结构查找》

ARM Trusted Firmware-A RISC-V OpenSBI 汇总

Trusted Firmware-A如图为 ARM TrustedFirmware (可信固件) 开源项目集合,它为带有 Exception Level 3 (EL3) Secure Monitor 的 ARM 架构 (Armv8-A、Armv9-A 和 Armv8-M 等) 提供了安全软件的实施参考实现。 1. TF-A 概述 Trusted Firmware-A (TF-A) project 是 ARM 可信固件…

使用 Keil 新建 Arm Visual Hardware(AVH) 项目

1 新建并配置项目 1.1 新建项目 我这里想模拟 Cortex-M55 核心,因此选择 SSE-300-MPS3由于是简单教程,我只想输出一个最简单的 Hello World,因此仅勾选串口相关的组件这里还需要特殊勾选一下以下选项1.2 配置Target Software Model 处选择 TrustZone disabledRead/Write Mem…

Java面试之多线程并发篇(9)

前言 本来想着给自己放松一下,刷刷博客,突然被几道面试题难倒!引用类型有哪些?有什么区别?说说你对JMM内存模型的理解?为什么需要JMM?多线程有什么用?似乎有点模糊了,那就大概看一下面试题吧。好记性不如烂键盘 *** 12万字的java面试题整理 *** *** java核心面试知识整…

记录---前端如何优雅通知用户刷新页面?

🧑‍💻 写在开头 点赞 + 收藏 === 学会🤣🤣🤣前言 老板:新的需求不是上线了嘛,怎么用户看到的还是老的页面呀 窝囊废:让用户刷新一下页面,或者清一下缓存 老板:那我得告诉用户,刷新一下页面,或者清一下缓存,才能看到新的页面呀,感觉用户体验不好啊,不能直接…