在Vue3中使用Echarts的示例

news2025/3/20 4:41:40

1.常用-引用ts文件方式

1.1 导出ts文件-一个简单的柱状图

export const baseBarChart = (xdata: string[], data: number[][], legendData: string[]) => {
  if (data.length === 0) {
    return noData;
  }
  // 定义颜色数组
  const color = [
    '#00CCCC',
    '#FF9900',
    '#1677DC',
    '#FF6666',
    '#B366FF',
    '#6666FF',
    '#3366CC',
    '#0099CC',
    '#00CC66',
    '#98CB19',
    '#FFCC00',
    '#666699',
  ];
  const maxDataValue = Math.max(...data.flat()); // 计算数据中的最大值
  const yAxisMax = Math.ceil(maxDataValue / 5) * 5; //  将最大值向上取整到最接近的5的倍数
  // 使用循环动态添加series,根据数组数目自动生成柱状图数量
  const seriseData = data.map((item, index) => {
    return {
      name: legendData[index],
      data: item,
      type: 'bar',
      // barWidth: 30,
      barMaxWidth: 30,
      xAxisIndex: 0,
      color: color[index], // 循环使用颜色数组
      label: {
        show: true, // 显示数值
        position: 'top', // 数值显示在柱子的顶部
        fontSize: 14, // 字体大小
        color: '#333333', // 字体颜色
        fontWeight: 'bold', // 字体加粗
      },
    };
  });

  // 完整的配置项
  let option: any = {
    tooltip: {
      trigger: 'axis',
      textStyle: {
        fontSize: 14,
        color: '#9A9A9A',
      },
    },
    grid: {
      containLabel: true,
      bottom: '15%',
      top: '10%',
      left: '2%',
      right: '2%',
    },
    xAxis: {
      type: 'category',
      data: xdata,

      axisLabel: {
        color: '#9a9a9a',
        fontSize: 12,
        interval: 'auto', // 自动隐藏部分标签(可根据需要调整为具体值)
        formatter: function (value: any) {
          // 截断过长的标签,并添加省略号
          return value.length > 2 ? value.slice(0, 2) + '...' : value;
        },
      },
    },

    yAxis: {
      type: 'value',
      min: 0,
      max: yAxisMax, // 动态设置最大值
      interval: yAxisMax / 5, // 根据最大值动态设置刻度间隔
      axisLabel: {
        color: '#9a9a9a',
        fontSize: 14,
      },
    },
    legend: {
      left: 'center',
      type: 'scroll',
      bottom: '2%',
      textStyle: {
        fontSize: 14,
        color: '#9A9A9A',
      },
      itemWidth: 16,
      itemHeight: 10,
    },
    series: seriseData,
  };

  return option;
};

1.2 vue文件-部分

   <div id="chartContainerBarTwo" ref="chartContainerBarTwo" class="chartContainerBarTwo">
        </div>
import { baseBarChart, baseLineChart, baseCircleChart } from '../../../echarts';
import { onMounted, ref, Ref, computed } from 'vue';
import { useECharts } from '@/hooks/web/useECharts';
import * as echarts from 'echarts';
onMounted(() => {
  init();
});
function init() {

  initDeviceCountChartTwo();

}
  const chartContainerBarTwo = ref<HTMLDivElement | null>(null);
第一种
const initDeviceCountChartTwo = async () => {
 // 初始化图表并获取实例
  const { setOptions, getInstance } = useECharts(chartContainerBarTwo as Ref<HTMLDivElement>);
  try {
    let legend: any = ['智能仪表'];
    let xdata: any = ['天津分公司', '深圳分公司', '海南分公司', '湛江分公司', '上海分公司'];
    let data: any = [[46224, 13021, 3791, 9072, 4557]];
    setOptions(baseBarChart(xdata, data, legend));
  // 获取图表实例并保存(如果需要)
    const currentChartInstance = getInstance();
    console.log('当前图表实例已保存:', currentChartInstance);
    loading1.value = false;
  } catch (error) {
    setOptions(baseBarChart([], [], []));
    loading1.value = false;
  }
};
第二种
const initDeviceCountChartTwo = async () => {
    const chart = echarts.init(chartContainerBarTwo.value);
  try {
    let legend: any = ['智能仪表'];
    let xdata: any = ['天津分公司', '深圳分公司', '海南分公司', '湛江分公司', '上海分公司'];
    let data: any = [[46224, 13021, 3791, 9072, 4557]];
    chart.setOption(baseBarChart(xdata, data, legend));
    loading1.value = false;
  } catch (error) {
     setOptions(baseBarChart([], [], []));
    loading1.value = false;
  }
};

PS:与之对应的还有图表resize函数,详情见博客解决 ECharts 切换图表时的 Resize 问题-CSDN博客

2.封装-ref作为传参

这是一个环形图ts文件,效果如下,中间可放图片,内外圈颜色不一样,可设置题目

import * as echarts from 'echarts';
import { type ECharts, init } from 'echarts';
import type { Ref } from 'vue';
import imagePath from '../views/index/instrumentDevice/img/circle-center.png';
/**
 * 初始化 ECharts 图表的通用函数
 * @param chartRef - Vue 的 ref,指向 DOM 元素
 * @param data - 图表数据
 * @param colors - 渐变颜色外圈数组
 * @param colorse - 渐变颜色内圈数组
 * @param title - 图表标题(可选)
 * @returns ECharts 实例
 */
function initEcharts(
  chartRef: Ref<HTMLDivElement | null>,
  data: any[],
  colors: string[][],
  colorse: string[][],
  title?: string,
): ECharts | null {
  // 检查 ref 是否有效
  if (!chartRef.value) {
    console.error('ECharts ref is not valid');
    return null;
  }

  // 创建 ECharts 实例
  const myChart = init(chartRef.value);

  // 计算总计
  const total = data.reduce((acc, item) => acc + Number(item.value), 0);

  // 图表配置
  const chartData = {
    title: {
      text: title,
      left: 'left',
      top: '5%',
      textStyle: {
        fontSize: 18,
        fontWeight: 'bold',
        color: '#ffffff',
      },
    },
    legend: {
      top: '90%',
      left: 'center',
      itemWidth: 16,
      itemHeight: 10,
      textStyle: {
        color: '#ffffff',
      },
    },
    tooltip: {
      show: false,
      formatter: (params: any) => {
        const percent = ((params.value / total) * 100).toFixed(1);
        return `总计: ${params.value} (${percent}%)`;
      },
      trigger: 'item',
      confine: true,
      backgroundColor: '#1E2857',
      borderColor: '#1E2857',
      color: '#fff',
      textStyle: {
        color: '#fff',
      },
      axisPointer: {
        type: 'cross',
        label: {
          backgroundColor: '#6a7985',
        },
      },
    },
    grid: {
      top: '0%',
      left: '0%',
      right: '0%',
      bottom: '0%',
    },
    graphic: [
      {
        type: 'image',
        style: {
          image: imagePath,
          width: 150,
          height: 150,
        },
        left: 'center',
        top: 'center',
      },
      {
        type: 'text', // 添加文本元素
        style: {
          text: `总计: ${total}`, // 显示总计信息
          fontSize: 16,
          fontWeight: 'bold',
          fill: '#ffffff', // 文本颜色
        },
        left: 'center', // 水平居中
        top: '85%', // 距离底部 5%
      },
    ],
    series: [
      // 外圈
      {
        type: 'pie',
        radius: ['50%', '60%'],
        avoidLabelOverlap: true,
        z: 11,
        label: {
          show: true, // 外圈显示标签
          position: 'outside',
          formatter: (params: any) => {
            const percent = ((params.value / total) * 100).toFixed(1);
            return `${params.name} ${percent}%`;
          },
          fontSize: 14,
          color: '#ffffff',
        },
        labelLine: {
          show: true,
          length: 10,
          length2: 20,
          position: 'outside',
          lineStyle: {
            color: '#ffffff',
          },
        },
        data: data.map((item, index) => ({
          ...item,
          itemStyle: {
            color: new echarts.graphic.RadialGradient(0, 0, 1, [
              { offset: 0, color: colors[index][0] },
              { offset: 1, color: colors[index][1] },
            ]),
          },
          label: {
            show: item.value > 0, // 当值大于 0 时显示标签
          },
          labelLine: {
            show: item.value > 0, // 当值大于 0 时显示引导线
          },
        })),
      },
      // 内圈阴影
      {
        type: 'pie',
        radius: ['40%', '60%'],
        avoidLabelOverlap: true,
        z: 10,
        itemStyle: {
          borderRadius: 2,
          borderWidth: 1,
          shadowBlur: 20,
          shadowColor: '#1569ff',
          shadowOffsetX: 0,
          shadowOffsetY: 0,
        },
        label: {
          show: false, // 内圈不显示标签
        },
        labelLine: {
          show: false, // 内圈不显示引导线
        },
        data: data.map((item, index) => ({
          ...item,
          itemStyle: {
            color: new echarts.graphic.RadialGradient(0, 0, 1, [
              { offset: 0, color: `${colors[index][0]}4D` }, //渐变色透明度
              { offset: 1, color: `${colors[index][0]}4D` },
            ]),
          },
        })),
      },
    ],
    animation: false,
  };

  // 设置图表配置
  myChart.setOption(chartData, true);

  return myChart;
}
export default initEcharts;

vue文件-部分

<div v-if="currentChart === 'SIS'" ref="echartsRefSIS" class="content_echarts"></div>
  const echartsRefSIS = ref<HTMLDivElement | null>(null);
 let ref: Ref<HTMLDivElement | null> | null = null;
        ref = echartsRefSIS;

// 初始化 ECharts 实例
    const myChart = initEcharts(ref, annularList, gradientColors, gradientColorse, title);
    currentChartInstance = myChart; // 保存当前图表实例

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

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

相关文章

GHCTF web方向题解

upload?SSTI! import os import refrom flask import Flask, request, jsonify,render_template_string,send_from_directory, abort,redirect from werkzeug.utils import secure_filename import os from werkzeug.utils import secure_filenameapp Flask(__name__)# 配置…

Logic-RL:小参数qwen模型复现DeepSeek R1 zero

最近很多参照DeepSeek模型训练推理模型的工作,本文将深入 “Logic-RL: Unleashing LLM Reasoning with Rule-Based Reinforcement Learning” 的论文,该论文提出了一种Rule-Based Reinforcement Learning, Logic-RL框架,旨在提升 LLM 的逻辑推理能力,在qwen2.5-7b-instruct…

CVE-2017-5645(使用 docker 搭建)

介绍: 是一个与 Apache Log4j2 相关的安全漏洞,属于远程代码执行,它可能允许攻击者通过构造恶意的日志信息 在目标系统上执行任意代码 Log4j2 介绍 Log4j2 是 Apache 的一个日志记录工具,属于 Java 应用的日志框架,它是 Log4j 的升级版,性能更好,功能更多.它被广泛的适用于 J…

蓝桥杯备考:特殊01背包问题——》集合subset

我们划分成两个集合&#xff0c;实际上我们只需要看一部分就行了&#xff0c;也就是从集合的所有元素里挑出恰好满足集合总和的一半儿&#xff0c;当然&#xff0c;如果我们的集合总和是奇数的话&#xff0c;我们是无论如何也挑不出刚好一半儿的&#xff0c;因为我们没有小数&a…

C#设计模式Demo——MVC

设计模式Demo——MVC 1.View1.1页面示例1.2View代码1.3修改界面以及代码 2.Model3.Controller4.数据结构5.枚举类型6.工具类6.1缓存信息6.2扩展类. 文件结构图 1.View 1.1页面示例 1.2View代码 using System; using System.Data; using System.Windows.Forms; using MVC模式…

【sql靶场】第18-22关-htpp头部注入保姆级教程

目录 【sql靶场】第18-22关-htpp头部注入保姆级教程 1.回顾知识 1.http头部 2.报错注入 2.第十八关 1.尝试 2.爆出数据库名 3.爆出表名 4.爆出字段 5.爆出账号密码 3.第十九关 4.第二十关 5.第二十一关 6.第二十二关 【sql靶场】第18-22关-htpp头部注入保姆级教程…

LabVIEW棉花穴播器排种自动监测系统

一、项目背景与行业痛点 1. 农业需求驱动 我国棉花主产区&#xff0c;种植面积常年超250万公顷&#xff0c;传统人工播种存在两大核心问题&#xff1a; 效率瓶颈&#xff1a;人均日播种面积不足0.5公顷&#xff0c;难以匹配规模化种植需求&#xff1b; 精度缺陷&#xff1a;人…

【程序人生】成功人生架构图(分层模型)

文章目录 ⭐前言⭐一、根基层——价值观与使命⭐二、支柱层——健康与能量⭐三、驱动层——学习与进化⭐四、网络层——关系系统⭐五、目标层——成就与财富⭐六、顶层——意义与传承⭐外层&#xff1a;调节环——平衡与抗风险⭐思维导图 标题详情作者JosieBook头衔CSDN博客专家…

速通大厂测开

最近26届暑期实习招聘和25届春招已经开始&#xff0c;测开学习圈也有同学拿到offer了 今天分享一位25届秋招圈友快速拿到大厂测开offer的经历&#xff0c;希望对大家有所帮助 我是某211本科生&#xff0c;在去年暑假准备考研的间隙意外收获了某大厂测开实习offer&#xff0c;…

基于Netty实现高性能HTTP反向代理

以下将分步骤实现一个基于Netty的高性能HTTP反向代理&#xff0c;支持动态路由、负载均衡和基础鉴权功能。 1. 项目依赖配置&#xff08;Maven&#xff09; 2. 定义路由规则 3. 实现HTTP反向代理服务端 4. 实现反向代理处理器 5. 实现基础鉴权 6. 性能优化策略 连接池管理…

【NLP 37、实践 ⑨ NER 命名实体识别任务 LSTM + CRF 实现】

难过的事情我要反复咀嚼&#xff0c;嚼到它再也不能困扰我半分 —— 25.3.13 数据文件&#xff1a; 通过网盘分享的文件&#xff1a;Ner命名实体识别任务 链接: https://pan.baidu.com/s/1fUiin2um4PCS5i91V9dJFA?pwdyc6u 提取码: yc6u --来自百度网盘超级会员v3的分享 一、配…

再学:函数可见性、特殊函数、修饰符

目录 1.可见性 2.合约特殊函数 constructor && getter 3. receive && fallback 4.view && pure 5.payable 6.自定义函数修饰符 modifier 1.可见性 public&#xff1a;内外部 private&#xff1a;内部 external&#xff1a;外部访问 internal&…

基于Spring Boot的项目申报系统的设计与实现(LW+源码+讲解)

专注于大学生项目实战开发,讲解,毕业答疑辅导&#xff0c;欢迎高校老师/同行前辈交流合作✌。 技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;…

Web元件库 ElementUI元件库+后台模板页面(支持Axure9、10、11)

Axure是一款非常强大的原型设计工具&#xff0c;它允许设计师和开发者快速创建高保真原型&#xff0c;以展示应用或网站的设计和功能。通过引入各种元件库&#xff0c;如ElementUI元件库&#xff0c;可以极大地丰富Axure的原型设计能力&#xff0c;使其更加贴近实际开发中的UI组…

孜然SEO静态页面生成系统V1.0

孜然SEO静态页面生成系统&#xff0c;1秒生成上万个不同的静态单页系统&#xff0c;支持URL裂变采集&#xff0c;采集的内容不会重复&#xff0c;因为程序系统自带AI重写算法&#xff0c;AI扩写算法&#xff0c;可视化的蜘蛛池系统让您更清楚的获取到信息&#xff01; 可插入二…

Blender-MCP服务源码3-插件开发

Blender-MCP服务源码3-插件开发 Blender-MCP服务源码解读-如何进行Blender插件开发 1-核心知识点 1&#xff09;使用Blender开发框架学习如何进行Blender调试2&#xff09;学习目标1-移除所有的Blender业务-了解如何MCP到底做了什么&#xff1f;3&#xff09;学习目标2-模拟MC…

C语言和C++到底有什么关系?

C 读作“C 加加”&#xff0c;是“C Plus Plus”的简称。 顾名思义&#xff0c;C 就是在 C 语言的基础上增加了新特性&#xff0c;玩出了新花样&#xff0c;所以才说“Plus”&#xff0c;就像 Win11 和 Win10、iPhone 15 和 iPhone 15 Pro 的关系。 C 语言是 1972 年由美国贝…

【华三】路由器交换机忘记登入密码或super密码的重启操作

【华三】路由器交换机忘记登入密码或super密码的重启操作 背景步骤跳过认证设备&#xff1a;路由器重启设备翻译说明具体操作 跳过当前系统配置重启设备具体操作 背景 当console口的密码忘记&#xff0c;或者说本地用户的密码忘记&#xff0c;其实这时候是登入不了路由器的&am…

DeepSeek-prompt指令-当DeepSeek答非所问,应该如何准确的表达我们的诉求?

当DeepSeek答非所问&#xff0c;应该如何准确的表达我们的诉求&#xff1f;不同使用场景如何向DeepSeek发问&#xff1f;是否有指令公式&#xff1f; 目录 1、 扮演专家型指令2、 知识蒸馏型指令3、 颗粒度调节型指令4、 时间轴推演型指令5、 极端测试型6、 逆向思维型指令7、…

HOVER:人形机器人的多功能神经网络全身控制器

编辑&#xff1a;陈萍萍的公主一点人工一点智能 HOVER&#xff1a;人形机器人的多功能神经网络全身控制器HOVER通过策略蒸馏和统一命令空间设计&#xff0c;为人形机器人提供了通用、高效的全身控制框架。https://mp.weixin.qq.com/s/R1cw47I4BOi2UfF_m-KzWg 01 介绍 1.1 摘…