【Echarts系列】带图片的饼图

news2025/1/13 16:39:46

【Echarts系列】带图片的饼图

    • 前提说明
    • 示例
    • 数据格式
    • 代码
    • 动态旋转图片

为了节省后续开发学习成本,这个系列将记录我工作所用到的一些echarts图表。

前提说明

因为饼图中间需要添加图片,所以比较特殊,对于饼图中间数据的对齐很容易出现问题,大家参考时以具体要求进行修改。【本人对于对齐的处理过于简单粗暴,大家有更好的办法可以加以指正】

同时,因Echarts使用版本不同,有些参数可以省略,而有些效果可能也没法呈现,当前示例是基于4.8.0版本的,当前最新版本还可以实现中间图片360°循环旋转的效果。

示例

带图片的饼图如图所示:
在这里插入图片描述
关于代码中:tooltip的内容{b} : {c}公顷 占比{d}%
在这里插入图片描述

数据格式

data = [
    {
      value: 117.6,
      name: '居住'
    },
    {
      value: 1115.2,
      name: '工业'
    },
    {
      value: 1122.4,
      name: '商业'
    },
    {
      value: 1114.8,
      name: '其他'
    }
  ]

代码

Vue版本以及脚本语言的选择各有不同,核心内容主要是option,重点关注该部分内容即可。

<template>
  <div class="chart" ref="graphicPieRef"></div>
</template>

<script lang="ts">
import { Component, Prop, Ref, Vue, Watch } from 'vue-property-decorator'
import echarts from 'echarts'

@Component({
  name: 'GraphicPie',
  components: {}
})
export default class GraphicPie extends Vue {
  @Prop() data!: any
  @Ref() graphicPieRef!: any
  private chart: any = {}

  @Watch('data')
  onDataChange() {
    this.createChart()
  }

  lefts = ['18%', '15.5%', '13.5%', '11.5%', '9.5%', '7.5%', '5.5%', '3.5%', '1.5%']

  createChart() {
    this.chart = echarts.init(this.graphicPieRef)
    
    //添加在饼图中的图片
    const img = require('@/assets/img/cockpit/center-pie.png')
    const data = this.data
    
    //计算数据的总值
    let total = this.data.reduce((acc: number, cur: any) => {
      return acc + cur.value
    }, 0)
    total = total.toFixed(1)
    
    //此处是为了获取总数相应位数应该对齐的位置
    let left = this.lefts[total.toString().length - 1]
    const option = {
      tooltip: {
        trigger: 'item',
        formatter: '{b} : {c}公顷 占比{d}%',
        confine: true
      },
      legend: {
        icon: 'circle',
        orient: 'vertical',
        right: 0,
        top: 'center',
        itemGap: 10,
        itemWidth: 8,
        itemHeight: 8,
        formatter: function(name: string) {
          let target: number = 0
          let percent: any
          
          // 计算对应图例数据的所占百分比
          for (let i = 0; i < data.length; i++) {
            if (data[i].name === name) {
              target = Number(data[i].value)
              if (target === 0) {
                percent = 0
              } else {
                percent = (target / total * 100).toFixed(2)
              }
            }
          }
          
          let formattedName = ''
          
          //当图例文字过于长时,可以选择添加换行符
          for (let i = 0; i < name.length; i += 6) {
            formattedName += name.substring(i, i + 6) + '\n'
          }
          if (formattedName.endsWith('\n')) {
            formattedName = formattedName.slice(0, -1)
          }

          var arr = [
            '{name|' + formattedName + '}',
            '{value|' + target + '}',
            '{unit|公顷}',
            '{value1|' + percent + '}',
            '{unit|%}'
          ]
          return arr.join(' ')
        },
        textStyle: {      //使用rich格式化图例数据的展示
          rich: {
            name: {
              width: 70,
              color: '#757790'
            },
            value: {
              width: 35,
              color: '#194178',
              align: 'center'
            },
            value1: {
              width: 27,
              color: '#194178',
              align: 'center'
            },
            unit: {
              color: '#757790'
            }
          }
        }
      },
      graphic: [
        {
          type: 'image',   //添加图片
          style: {         //设置图片样式
            image: img,
            width: 95,
            height: 95
          },
          left: '5%',      //设置图片位置
          top: 'center'
        },
        {
          type: 'text',    //设置圆环中的总数位置上的样式
          left: left,
          top: '40%',
          style: {
            text: total,
            textAlign: 'center',
            fill: '#194178',
            fontSize: 24,
            fontWeight: 400
          }
        },
        {
          type: 'text',   //设置圆环中的单位位置上的样式
          left: '12%',
          top: '55%',
          style: {
            text: '总量(公顷)',
            textAlign: 'center',
            fill: '#757790',
            fontSize: 12,
            fontWeight: 400
          }
        }
      ],
      color: [
        '#ED5A75',
        '#59C975',
        '#5C87DA',
        '#00A2FF',
        '#B6D7E9',
        '#F9D03F',
        '#E3A256'
      ],
      series: [
        {
          type: 'pie',
          radius: ['48%', '62%'],  //设置两个圆环的大小
          center: ['20%', '50%'],  //设置饼图在网格容器中的位置
          data: data,
          // 间隔
          itemStyle: {
            normal: {
              borderWidth: 4,
              borderColor: '#fff'
            }
          },
          label: {  //是否显示饼图数据
            show: false
          },
          labelLine: {  //是否显示引导线
            show: false
          }
        }
      ]
    }
    this.chart.setOption(option)
  }

  mounted() {
    this.createChart()
    window.addEventListener('resize', this.chartResize)
  }

  beforeDestroy() {
    if (this.chart) {
      window.removeEventListener('resize', this.chartResize)
      this.chart.dispose()
    }
  }

  chartResize() {
    if (this.chart) {
      this.chart.resize()
    }
  }
}
</script>
<style lang="scss" scoped>
.chart {
  width: 100%;
  height: 400px;
}
</style>


动态旋转图片

如果需要实现图片的动态旋转效果的话,可以在graphic中type属性为image的项中添加如下内容:

keyframeAnimation: [
     {
         duration: 200000,       //设置间隔时间
         loop: true,             //是否开启循环
         keyframes: [            //动画效果
             {
                 percent: 0,
                 rotation: 0
             },
             {
                 percent: 1,
                 rotation: -360
             }
         ]
     }
 ]

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

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

相关文章

【npm】console工具(含胶囊,表格,gif图片)

这是一款控制台花样输出工具 相对丰富的输出方式 文本输出属性值输出胶囊样式输出表格输出图片输出&#xff08;含动图&#xff09; 安装 npm install v_aot引用 import v_aot from "v_aot";字段说明 字段类型属性字符串值字符串类型default 、 primary 、 suc…

Centos用自定义java安装包替换系统java版本

一.下载自定义安装java压缩包&#xff0c;比如 jdk-8u191-linux-x64.tar.gz 二.解压到/usr/java/ 下 tar -zxvf jdk-8u191-linux-x64.tar.gz 三.执行命令 update-alternatives --install /usr/bin/java java /usr/java/jdk1.8.0_191/bin/java 300 update-alternatives --i…

【全开源】旅游系统小程序(Uniapp+FastAdmin+ThinkPHP)

&#x1f308;暑假到来&#xff0c;旅游系统小程序助你畅游无忧&#xff01;&#x1f392; 旅游系统&#xff0c;包含消费者端&#xff08;手机端&#xff09;、机构工作人员&#xff08;手机端&#xff09;、机构端&#xff08;PC&#xff09;、平台管理端&#xff08;PC&…

Python基础速成

文件操作 文件读取 with open语法 文件写入 注意事项 文件追加 异常、模块与包 捕获异常 捕获方法 捕获传递 模块的导入与自定义 定义 导入方式 自定义 测试模块 注意事项 python包 定义 操作 第三方包 定义 pip指令安装包

实现思路:Vue 子组件高度不固定下实现瀑布流布局

实现思路&#xff1a;Vue 子组件高度不固定下实现瀑布流布局 一、瀑布流布局基础实现原理 在深入解说不定高度子组件的瀑布流如何实现之前&#xff0c;先大体说一下子组件高度固定已知的这种实现原理&#xff1a; 有一个已知组件高度的数组。定义好这个瀑布流的列数&#xff…

新概念英语视频百度云,新概念英语视频百度网盘,新概念1-4册

在现今数字化时代&#xff0c;英语学习资源丰富多样&#xff0c;其中新概念英语视频因其深入浅出的教学风格和丰富多样的学习内容&#xff0c;备受广大英语学习者的青睐。本文旨在为广大英语学习者提供一份详尽的新概念英语视频下载指南&#xff0c;帮助大家轻松获取优质学习资…

Macbook M芯片Homebrew与git的安装与配置

Macbook M芯片Homebrew与git的安装与配置 Homebrew的安装与配置 搜索Homebrew; 找到如下网址https://brew.sh/ 把以上命令复制到终端 执行后&#xff0c;发现并不能下载&#xff1b; 如果你像我一样也是不通的&#xff0c;可以使用国内源,将如下命令复制到终端&#xff1a;…

【C++题解】1750 - 有0的数

问题&#xff1a;1750 - 有0的数 类型&#xff1a;简单循环 题目描述&#xff1a; 请求出 1∼n 中含有数字 0 的数&#xff0c;有多少个&#xff1f; 输入&#xff1a; 一个整数 n&#xff08;n≤999&#xff09; 。 输出&#xff1a; 一个整数&#xff0c;代表 1∼n 中含…

关于Spring Security的CORS

目录 一、CORS是什么 二、同源安全策略 三、Spring Security中CORS的开启 四、其它处理方法 一、CORS是什么 CORS&#xff08;Cross-Origin Resource Sharing&#xff0c;跨源/域资源共享 &#xff09;是一个W3C标准&#xff0c;一种允许当前域&#xff08;domain&#xff…

苹果WWDC揭晓AI系统、电脑等设备系统全线更新,iPhone将接入ChatGPT

iOS 18可自定义主屏幕、可卫星发短信、钱包App新增点击付款Tap to Cash功能、照片App大改、支持RCS短信&#xff1b;iPad首次有原生计算器App&#xff0c;iPad结合Apple Pencil拥有数学笔记功能&#xff1b;新版macOS可通过Mac查看控制iPhone&#xff0c;Safari有AI驱动的高亮显…

Docker:安装 Orion-Visor 服务器运维的技术指南

请关注微信公众号&#xff1a;拾荒的小海螺 博客地址&#xff1a;http://lsk-ww.cn/ 1、简述 Orion-Visor 是一种用于管理和监控容器的工具。它提供了一个直观的界面&#xff0c;用于查看容器的状态、资源使用情况以及日志等信息。在这篇技术博客中&#xff0c;我们将介绍如何…

01.FastLED库基础

FastLED库基础 FastLED库HSV颜色 HSV颜色基本概念 HSV颜色简介 HSV(Hue, Saturation, Value)是根据颜色的直观特性由A. R. Smith在1978年创建的一种颜色表达方法。该方法中的三个参数分别是&#xff1a;色调&#xff08;H&#xff09;&#xff0c;饱和度&#xff08;S&#…

Jenkins三种构建类型

目录 传送门前言一、概念二、前置处理&#xff08;必做&#xff09;1、赋予777权限2、让jenkins用户拥有root用户的kill权限3、要运行jar包端口号需要大于1024 三、自由风格软件项目&#xff08;FreeStyle Project&#xff09;&#xff08;推荐&#xff09;三、Maven项目&#…

最全面又最浅显易懂的Langchain快速上手教程(下)

最全面又最浅显易懂的Langchain快速上手教程&#xff08;下&#xff09; 三. 深入Langchain 1. 架构设计 从上文知道Langchain在架构上使用了从抽象、到具体、再到整合适配的三层架构&#xff0c;这种一层一层逐渐具体的设计最大可能性的保证了架构的可扩展性和维护性。同时…

【Python】 探索 Python 中的 Ellipsis 对象:一个神奇的省略号

基本原理 在 Python 中&#xff0c;Ellipsis 对象是一个特殊的内置对象&#xff0c;它通常用三个连续的点 ... 来表示。这个对象在 Python 中有几个特定的用途&#xff0c;尤其是在切片操作和迭代器表达式中。虽然它看起来像是一个普通的省略号&#xff0c;但它实际上是 Pytho…

DeepSORT(目标跟踪算法)中自由度决定卡方分布的形状

DeepSORT&#xff08;目标跟踪算法&#xff09;中自由度决定卡方分布的形状 flyfish 重要的两个点 自由度决定卡方分布的形状&#xff08;本文&#xff09; 马氏距离的平方在多维正态分布下服从自由度为 k 的卡方分布 独立的信息 在统计学中&#xff0c;独立的信息是指数据…

MySQL的group by与count(), *字段使用问题

文章目录 问题group by到底做了什么举个例子简单来说为什么select字段&#xff0c;count()不能和*共同使用总结 问题 这是一段摘抄自MySQL官网的文字。其大致意思是MySQL拓展了group by的使用&#xff0c;MySQL允许选择没有出现在group by中的字段。换句话说&#xff0c;标准SQ…

覆盖路径规划经典算法 The Boustrophedon Cellular Decomposition 论文及代码详解

2000年一篇论文 Coverage of Known Spaces: The Boustrophedon Cellular Decomposition 横空出世&#xff0c;解决了很多计算机和机器人领域的覆盖路径问题&#xff0c;今天我来详细解读这个算法。 The Boustrophedon Cellular Decomposition 算法详解 这篇论文标题为"C…

【Qt】TreeWidget中Item的UserCheckable注意事项,没有出现多选框

1. 异常 开启 ItemIsUserCheckable以后&#xff0c;界面上没有出现多选框。 QTreeWidgetItem *item new QTreeWidgetItem();item->setText(0, "hello");item->setFlags(Qt::ItemIsUserCheckable | Qt::ItemIsSelectable |Qt::ItemIsEnabled | Qt::ItemIsAuto…

最新thinkphp5内核全开源女神赢口红H5公众号版第五版(100%可经营)

最新thinkphp5内核全开源女神赢口红H5公众号版第五版&#xff08;100%可经营&#xff09; 搭建教程 1、程序为thinkPHP5开发 php版本要求5.6&#xff01;不支持虚拟主机&#xff01; 2、上传程序到您的根目录&#xff01;导入m213.sql文件&#xff01;修改数据库配置文件app…