Vue2项目中使用 echarts(5.2.2)图表组件含代码(二)

news2024/11/24 15:44:47

1.图表预览

2.注释说明

Vue 的组件开发

  • 通过 props 定义外部传入的属性,例如 classNamewidthheightautoResizechartData 等。
  • 使用 Vue 的生命周期钩子函数 mounted 进行 ECharts 的实例化,确保组件加载完毕后才初始化图表。
  • 通过 watch 监听 chartData 数据的变化,自动更新图表。

ECharts 实例化和配置

  • 使用 echarts.init(this.$el) 创建图表实例,绑定到 Vue 组件的 DOM 元素上。
  • this.chart.setOption(option, true) 更新 ECharts 图表的配置。
  • 定义了自适应窗口大小的功能,监听 window.onresize,动态调整图表大小。

计算方法和自定义配置

  • fontSize(res) 根据窗口宽度动态计算字体大小,用于图表的响应式布局。
  • getPie3D(pieData, internalDiameterRatio)getParametricEquation() 是生成 3D 饼图的关键函数,使用数学公式构建 3D 饼图的曲面方程,并自定义了饼图的大小、半径、角度、选中效果等。
  • formatter 函数用于自定义图表的 legendtooltip 显示格式,返回带有富文本样式的字符串。

3.页面引入

<div class="com-view-body c-dis-flex-col c-hidden">
    <div class="c-width c-flex c-dis-flex-col c-hidden">
       <ChartView :chart-data="riskChartData"></ChartView>
    </div>
</div>

import { randomNum } from '@/utils/index.js'
import ChartView from '@/components/Charts/ChartView.vue'


 riskChartData: {
        name: "风险总数",
        color: ["#ED6F81", "#F3843D", "#4B64F7", "#34C294"],
        legend: ['二级风险', '三级风险', '四级风险', '五级风险'],
        data: [
          { name: "二级风险", value: 0, unit: "个" },
          { name: "三级风险", value: 0, unit: "个" },
          { name: "四级风险", value: 0, unit: "个" },
          { name: "五级风险", value: 0, unit: "个" },
        ],
},

4.图表组件 

<template>
  <div :class="className" :style="{ height: height, width: width }" />
</template>

<script>
import * as echarts from 'echarts'; // 导入 echarts 库
import "echarts-gl"; // 导入 echarts 的 3D 图表支持
import resize from '@/components/mixin/resize'; // 导入窗口 resize 相关的 mixin

export default {
  mixins: [resize], // 引入 mixin
  props: {
    className: {
      type: String,
      default: 'chart', // 默认样式名为 'chart'
    },
    width: {
      type: String,
      default: '100%', // 默认宽度为 100%
    },
    height: {
      type: String,
      default: '100%', // 默认高度为 100%
    },
    autoResize: {
      type: Boolean,
      default: true, // 默认启用自动调整大小
    },
    chartData: {
      type: Object,
      default: () => { } // 默认空对象,存储图表数据
    }
  },
  data() {
    return {
      chart: null, // 存储 echart 实例
      chartColor: {
        text: '#ffffff', // 文字颜色
        bg: '#02456b', // 背景色
        color: ['#06DEF3', '#1779CE', '#FAD961', '#F76B1C'], // 数据颜色
      },
      hoveredIndex: '', // 记录鼠标悬浮的索引
      option: null // 存储图表配置
    }
  },
  mounted() {
    // DOM 渲染后初始化图表
    this.$nextTick(() => {
      this.chart = echarts.init(this.$el); // 初始化 echart 实例
      this.initChart(); // 调用初始化方法
    });
  },
  watch: {
    chartData: {
      deep: true, // 深度监听 chartData
      handler(val) {
        this.initChart(); // 当 chartData 发生变化时,重新初始化图表
      },
    },
  },
  methods: {
    /**
     * 根据屏幕大小调整字体大小
     * @param {Number} res 原始字体大小
     * @return {Number} 调整后的字体大小
     */
    fontSize(res) {
      let clientWidth =
        window.innerWidth ||
        document.documentElement.clientWidth ||
        document.body.clientWidth;
      if (!clientWidth) return;
      let fontSize = clientWidth / 1920; // 按 1920 设计稿宽度计算比例
      return res * fontSize;
    },

    /**
     * 初始化图表,设置图表配置项
     */
    initChart() {
      let that = this;
      const series = this.getPie3D(this.chartData.data, 0.85); // 生成3D饼图的系列
      series.push({
        name: "pie2d", // 2D饼图,用于3D饼图视觉对齐
        type: "pie",
        labelLine: { length: 0, length2: 0 },
        startAngle: 2, // 起始角度
        clockwise: false, // 逆时针旋转
        radius: ["0%", "0%"], // 饼图半径
        center: ["0%", "0%"], // 饼图中心位置
        data: this.chartData.data,
        itemStyle: { opacity: 0 } // 设置透明度
      });

      let rich = { name: { fontSize: this.fontSize(12), color: "#fff" } };
      // 动态生成 rich 配置,用于自定义图例文本样式
      for (let i = 0; i < 7; i++) {
        rich[`name${i}`] = {
          fontSize: this.fontSize(i === 1 ? 16 : 20),
          align: 'left',
          padding: [0, 0, 0, this.fontSize(10)],
          fontWeight: i === 1 ? 900 : 600,
          color: i !== 0 ? this.chartData.color[i - 2] : 'rgba(130, 159, 179, 1)'
        };
      }

      // 动态为每个数据项添加样式
      this.chartData.data.map((item, index) => {
        let style = {
          fontSize: this.fontSize(16),
          padding: [0, 5, 0, 5],
          color: this.chartData.color[index],
        };
        this.$set(rich, `value${index}`, style);
      });

      // 定义图表配置项
      let option = {
        color: this.chartData.color,
        legend: {
          show: true,
          orient: 'vertical',
          right: '5%',
          top: 'center',
          itemWidth: this.fontSize(16),
          itemHeight: this.fontSize(4),
          textStyle: {
            fontWeight: 400,
            color: '#CEE8F8',
            fontSize: this.fontSize(14),
            lineHeight: this.fontSize(26),
            rich: rich,
          },
          formatter: function (name) {
            let res = that.chartData.data.find(v => v.name === name);
            return `{name1|${res.name}}{name${that.chartData.data.indexOf(res) + 2}|${res.value}}{name0|${res.unit}}`;
          },
        },
        tooltip: {
          formatter: function (optionsData) {
            let value = that.chartData.data.find(v => v.name === optionsData.seriesName)?.value || 0;
            return `${optionsData.seriesName}: ${value}`;
          },
          borderColor: this.chartColor.bg,
          backgroundColor: this.chartColor.bg,
          textStyle: {
            color: '#fff',
            fontSize: this.fontSize(12),
            rich: rich
          },
        },
        title: {
          text: that.chartData.name,
          textAlign: 'center',
          left: '30%',
          top: '43%',
          textStyle: { color: "#fff", fontSize: this.fontSize(14) },
        },
        series: series,
      };

      this.chart.setOption(option, true); // 设置图表配置项
      this.chart.resize(); // 图表自适应
      window.onresize = () => this.chart.resize(); // 监听窗口大小变化
    },

    /**
     * 生成扇形的参数方程
     * @param {Number} startRatio 扇形起始比例
     * @param {Number} endRatio 扇形结束比例
     * @param {Boolean} isSelected 是否选中
     * @param {Boolean} isHovered 是否悬浮
     * @param {Number} k 辅助参数
     * @param {Number} height 扇形高度
     * @param {Number} i 当前序号
     * @return {Object} 曲面参数方程
     */
    getParametricEquation(startRatio, endRatio, isSelected, isHovered, k, height, i) {
      // 曲面参数方程的实现,计算每个扇形的坐标和大小
      // ...
    },

    /**
     * 生成模拟 3D 饼图的配置项
     * @param {Array} pieData 饼图数据
     * @param {Number} internalDiameterRatio 内环直径比
     * @return {Array} 图表 series 配置项
     */
    getPie3D(pieData, internalDiameterRatio) {
      let series = [];
      let sumValue = pieData.reduce((sum, data) => sum + data.value, 0); // 计算总值
      let startValue = 0;

      pieData.forEach((data, i) => {
        let endValue = startValue + data.value;
        let seriesItem = {
          name: data.name || `series${i}`,
          type: "surface",
          parametric: true,
          pieData: data,
          pieStatus: { selected: false, hovered: false, k: (1 - internalDiameterRatio) / (1 + internalDiameterRatio) }
        };
        seriesItem.parametricEquation = this.getParametricEquation(
          startValue / sumValue,
          endValue / sumValue,
          false,
          false,
          seriesItem.pieStatus.k,
          10,
          i
        );
        startValue = endValue;
        series.push(seriesItem);
      });

      return series;
    },
  },
}
</script>

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

半小时速通RHCSA

1-7章: #01创建以上目录和文件结构&#xff0c;并将/yasuo目录拷贝4份到/目录下 #02查看系统合法shell #03查看系统发行版版本 #04查看系统内核版本 #05临时修改主机名 #06查看系统指令的查找路径 #07查看passwd指令的执行路径 #08为/yasuo/ssh_config文件在/mulu目录下创建软链…

【Vue】Vue扫盲(四)组件化思想与简单应用

【Vue】Vue扫盲&#xff08;一&#xff09;事件标签、事件修饰符&#xff1a;click.prevent click.stop click.stop.prevent、按键修饰符、及常用指令 【Vue】Vue扫盲&#xff08;二&#xff09;指令&#xff1a;v-for 、v-if、v-else-if、v-else、v-show 【Vue】Vue扫盲&…

Oracle-19g数据库的安装

简介 Oracle是一家全球领先的数据库和云解决方案提供商。他们提供了一套完整的技术和产品&#xff0c;包括数据库管理系统、企业级应用程序、人工智能和机器学习工具等。Oracle的数据库管理系统是业界最受欢迎和广泛使用的数据库之一&#xff0c;它可以管理和存储大量结构化和…

内核定时器API实现点灯

1.内核定时器 定时器是一个很常用的功能&#xff0c;需要周期性处理的工作都要用到定时器。 Linux 内核定时器 采用系统时钟来实现&#xff0c;并不是6ull里面的硬件定时器。 Linux 内核定时器使用很简单&#xff0c;只需要提供超时时间(相当于定时值)和定时处理函数即…

高阶数据结构与算法——红黑树の奥秘

1.认识红黑树 1.1红黑树的概念 红⿊树是⼀棵⼆叉搜索树&#xff0c;他的每个结点增加⼀个存储位来表⽰结点的颜⾊&#xff0c;可以是红⾊或者⿊⾊。通过对任何⼀条从根到叶⼦的路径上各个结点的颜⾊进⾏约束&#xff0c;红⿊树确保没有⼀条路径会⽐其他路径⻓出2倍&#xff0c…

graphrag学习总结

学习视频&#xff1a;b站链接 项目链接 GraphRAG 的基本概念 Document&#xff08;文档&#xff09;&#xff1a;系统中的输入文档。这些文档要么代表CSV中的单独行&#xff0c;要么代表单独的txt文件。 TextUnit&#xff08;文本块&#xff09;&#xff1a;要分析的文本块。…

pdf阅读软件有哪些?5个软件帮助你快速进行pdf阅读

pdf阅读软件有哪些&#xff1f;5个软件帮助你快速进行pdf阅读 如果你正在寻找优秀的PDF阅读软件&#xff0c;以下推荐的5款软件能够帮助你快速、轻松地阅读和管理PDF文件。这些工具各具特色&#xff0c;适用于不同的使用需求&#xff0c;无论是注释、签名、还是管理大文件&…

使用Rollup.js快速开始构建一个前端项目

Rollup 是一个用于 JavaScript 项目的模块打包器&#xff0c;它将小块代码编译成更大、更复杂的代码&#xff0c;例如库或应用程序。Rollup 对代码模块使用 ES6 模块标准&#xff0c;它支持 Tree-shaking&#xff08;摇树优化&#xff09;&#xff0c;可以剔除那些实际上没有被…

lwip多线程使用说明,注意事项

lwIP: Common pitfalls 相关问题&#xff1a; lwIP - A Lightweight TCP/IP stack - Bugs: bug #56531, Missing locking in tcp_input() [Savannah] 我也碰到了差不多情况

goDoH:一款使用了DNS-over-HTTPS作为传输端口的C2框架

工具介绍 goDoH是一款概念验证命令与控制框架&#xff0c;该工具采用Golang开发&#xff0c;并使用了DNS-over-HTTP作为传输介质。 项目依赖 goDoH的代码构建需要使用到Dep&#xff08;【GitHub传送门】&#xff09;&#xff0c;Dep是一款针对Go语言的依赖管理工具。 在mac…

【vue】vue-router_ vue3路由管理器

代码获取 vue-router_ vue3路由管理器 ⼀、基本介绍 1. 单⻚应⽤程序介绍 1.1 概念 单⻚应⽤程序&#xff1a;SPA(Single Page Application)是指所有的功能都在⼀个HTML⻚⾯上实现 1.2 具体⽰例 单⻚应⽤⽹站&#xff1a; ⽹易云⾳乐 https://music.163.com/ 多⻚应⽤⽹…

【Python语言进阶(二)】

一、函数的使用方式 将函数视为“一等公民” 函数可以赋值给变量函数可以作为函数的参数函数可以作为函数的返回值 高阶函数的用法&#xff08;filter、map以及它们的替代品&#xff09; items1 list(map(lambda x: x ** 2, filter(lambda x: x % 2, range(1, 10)))) # filter…

K8s简介和安装部署

一、 Kubernetes 简介及部署方法 1、应用部署方式演变 Kubernetes简称为K8s&#xff0c;是用于自动部署、扩缩和管理容器化应用程序的开源系统&#xff0c;起源于Google 集群管理工具Borg。 传统部署 &#xff1a;互联网早期&#xff0c;会直接将应用程序部署在物理机上 优…

python yolov8半自动标注

首先标注一部分图片&#xff0c;进行训练&#xff0c;生成模型&#xff0c;标注文件为xml方便后面统一做处理。 1、标注数据&#xff08;文件为xml, 转为txt用于训练&#xff0c;保留xml标签文件&#xff09; 2、模型训练&#xff08;训练配置、训练代码、&#xff09; 3、使用…

400行程序写一个实时操作系统(八):(必看!)使用gdb调试错误的程序

上一篇笔者讲完了内存管理算法的完整实现&#xff0c;不过差点忘了&#xff0c;直接上这一部分是不是有点不友好&#xff0c;要知道笔者当初写内存算法可是调试得死去活来&#xff0c;奇奇怪怪的问题不断出现。 就比如笔者当初写了一个内存池算法&#xff0c;结果奇葩的事情发…

大模型之三十二-语音合成TTS(coqui) 之二 fine-tune

在 大模型之三十-语音合成TTS(coqui)[shichaog CSDN]中提到了xttsv2的fine-tune。 数据情况&#xff1a; 我是从bilibili up主小Lin说提取了一些视频&#xff0c;然后进行了重新的fine-tune。 训练结果 如下图所示&#xff0c;上面波形幅度较大的是xttsv2原始模型的结果&am…

u盘被写保护怎么解除?u盘写保护怎么去掉?

我们平时在使用U盘的过程中&#xff0c;可能会遇到U盘无法写入文件、删除数据或是格式化的情况。同时还可能收到提示“改磁盘已写保护”。U盘被写保护可能是有意的设置&#xff0c;也可能是无疑的操作。那么U盘被写保护了该怎么解除呢&#xff1f;本期内容&#xff0c;我们将介…

最新版 Winows下如何安装Redis?

最新版 Winows下如何安装Redis&#xff1f; 一、Redis介绍 Redis是一个广泛使用的开源非关系型数据库&#xff0c;它在现代软件开发中扮演着重要角色。**作为一个基于内存的数据库&#xff0c;Redis的底层代码是用ANSI C编写的&#xff0c;这使得它在性能上非常出色。**Redis…

【AIF-C01认证】亚马逊云科技生成式 AI 认证正式上线啦

文章目录 一、AIF-C01简介二、考试概览三、考试知识点3.1 AI 和 ML 基础知识3.2 生成式人工智能基础3.3 基础模型的应用3.4 负责任 AI 准则3.5 AI 解决方案的安全性、合规性和监管 四、备考课程4.1 「备考训练营」 在线直播课4.2 「SkillBuilder」学习课程 五、常见问题六、参考…

前端开发攻略---使用ocr识别图片进行文字提取功能

1、引入资源 通过链接引用 <script src"https://cdn.bootcdn.net/ajax/libs/tesseract.js/5.1.0/tesseract.min.js"></script> npm或其他方式下载 npm i tesseract 2、示例 <!DOCTYPE html> <html lang"en"><head><meta…