【Echarts系列】带图片的饼图

【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
             }
         ]
     }
 ]

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

debain安装不上redis,采用docker安装

大家好&#xff0c;我是雄雄&#xff0c;欢迎关注微信公众号&#xff1a;雄雄的小课堂。 前言 新服务器&#xff0c;出现各种各样的问题&#xff0c;是完全&#xff01;可以&#xff01;理解的&#xff01;md…比如我的这个&#xff0c;就死活装不上redis。横装竖装用面板等等…

WMS仓储管理系统第三方冷库温湿度管理解决方案

随着现代物流行业的迅猛发展&#xff0c;第三方冷库作为冷链物流体系中的关键环节&#xff0c;其温湿度管理对于保障货物质量、提升物流效率具有至关重要的意义。近年来&#xff0c;WMS仓储管理系统技术的不断革新&#xff0c;为第三方冷库的温湿度管理带来了革命性的变革。本文…

数据分享 I 1970-2021年各区县碳排放总量

基本信息. 数据名称: 1970-2021年各区县碳排放总量 数据格式: Shpexcel 数据几何类型: 面 数据坐标系: WGS84 数据来源&#xff1a;网络公开数据

一文搞定自动化测试

为什么需要自动化测试&#xff1f; 一个多人合作&#xff0c;开发周期长的前端项目可能会出现以下问题&#xff1a; 代码风格各不相同代码过度耦合&#xff0c;阅读和维护极其困难新同学上手慢等等 为了解决这些问题&#xff0c;需要通过对核心组件进行自动化测试&#xff0…

S2B2C商城系统如何选择?

近年来&#xff0c;S2B2C商城模式被众多企业所青睐&#xff0c;其场景应用包括装修建材、家居用品、汽车、房产、家电、零售、生活用品等各个领域。那么&#xff0c;对于目前还没涉足电商领域的企业来说&#xff0c;SB2B2C商城系统如何选择呢&#xff1f;我们可以从推出时间、开…

跨式期权组合策略是什么?怎么使用跨式期权?

今天带你了解跨式期权组合策略是什么&#xff1f;怎么使用跨式期权&#xff1f;跨式期权策略&#xff0c;这个看似高深莫测的金融工具&#xff0c;实际上是一种非常灵活且实用的投资策略。它以其独特的风险收益特点&#xff0c;吸引了越来越多的投资者关注。 跨式期权组合策略是…

RedHat9 | 防火墙配置与管理

RedHat9中默认安装Firewalld&#xff0c;也可安装iptables。但是两者不可同时运行。 软件或程序主要作用firewalld、iptables策略限制MAC、IP、PORT、ARPSELinux上下文、布尔值、端口软件权限读写执行权限文件系统rwx、隐藏权限、ACL 1、Netfilter 包过滤防火墙工作在TCP/IP的…

【霸王餐系统】搭建部署,可设置二级分销

前言&#xff1a; 霸王餐项目通常是由外卖平台或商家发起的一种营销策略&#xff0c;旨在通过提供低成本甚至免费的外卖来吸引消费者&#xff0c;从而增加销量、优化评价并扩大市场影响力。这种项目往往能够实现平台、商家、推广者和消费者四方共赢的局面。 一、项目优势 市…

uniapp 展示地图,并获取当前位置信息(精确位置)

使用uniapp 提供的map标签 <map :keymapIndex class"container" :latitude"latitude" :longitude"longitude" ></map> 页面初始化的时候&#xff0c;获取当前的位置信息 created() {let that thisuni.getLocation({type: gcj02…

pepy - Python 包下载量统计工具站

文章目录 一、关于 pepy站点使用显示下载量 二、代码贡献依赖环境配置启动环境 三、架构和模式四、常问问题 一、关于 pepy 官网&#xff1a;https://www.pepy.techgithub : https://github.com/psincraian/pepy 前端&#xff1a;https://github.com/psincraian/pepy-front 站…

Linux文本三剑客 awk 和 grep

awk 前言 AWK是一种优良的文本处理工具。它不仅是 Linux中也是任何环境中现有的功能最强大的数据处理引擎之一。 Linux中最常用的文本处理工具有grep&#xff0c;sed&#xff0c;awk。行内将之称为文本三剑客&#xff0c;就功能量和效率来看&#xff0c;awk是当之无愧的文本三…

智能盒子如何检测进气压力传感器?

进气压力传感器是一种用于测量发动机进气系统中压力的传感器。安装在发动机的进气管路或进气歧管上&#xff0c;用于监测进气压力的变化。进气压力传感器的作用是将测量到的压力信号转换为电信号&#xff0c;以便发动机控制单元(ECU)可以根据压力变化来调整燃油喷射量、点火时机…

git版本控制流程

个人名片 &#x1f393;作者简介&#xff1a;java领域优质创作者 &#x1f310;个人主页&#xff1a;码农阿豪 &#x1f4de;工作室&#xff1a;新空间代码工作室&#xff08;提供各种软件服务&#xff09; &#x1f48c;个人邮箱&#xff1a;[2435024119qq.com] &#x1f4f1…

开启数字化校园时代:智慧教育的引领者

在当前数字化时代&#xff0c;智慧教育已经成为引领未来的热门议题。随着科技的不断进步和教育观念的演进&#xff0c;数字化校园正逐渐变为现实。作为教育界的领导者&#xff0c;我们积极践行智慧教育理念&#xff0c;为学生们营造一个更智能、高效的学习环境。 教育是每个国家…

零售业上云为什么首选谷歌云

零售业是国民经济的重要组成部分&#xff0c;在促进经济发展、改善人民生活水平方面发挥着重要作用。零售业也是一个竞争激烈的行业&#xff0c;零售企业需要不断创新经营方式、提高服务质量才能在竞争中立于不败之地。 近年来&#xff0c;中国企业在品牌出海方面&#xff0c;一…

常见电子元件封装

常用电子元件封装 本文摘要 本文主要讲述元件封装&#xff0c;我们想要用元件&#xff0c;当然要考虑到他的形状尺寸了&#xff0c;如果太大与结构冲突用不了&#xff0c;太小功率不满足使用在电路中而无法使用&#xff0c;每种元件也因为不同封装可以承受电压等级&#xff0c;…

实现数字化教育梦想:数字化校园解决方案的奇妙魅力

数字化校园解决方案正在以惊人的速度改变着传统教育的面貌&#xff0c;为教育事业注入了新的生机与活力。在这个数字时代&#xff0c;学校和教育机构面临着前所未有的挑战&#xff0c;而数字化校园解决方案则成为了应对这些挑战的利器。它集成了先进的技术和创新的教育理念&…

时间处理获取交易日(考虑兼容性问题)

在获取交易日时间的处理上&#xff0c;出现了苹果14不兼容的问题&#xff0c;就这个问题记录下。 一、获取交易日的代码 封装了一个js文件&#xff0c;在untils目录下&#xff0c;先看代码&#xff0c;然后我讲下思路。 // 获取节假日数据 import { getCalendarHolidays } …

# 常用刀具钢材介绍

常用刀具钢材介绍 文章目录 常用刀具钢材介绍1、M390 钢材详细介绍1.1、关键特性1.2、应用 2、 VG10 钢材详细介绍2.1、关键特性2.2、应用 3、N690 钢材详细介绍3.1、关键特性3.2、应用 4、D2, D53, 和 7Cr13MoV 钢材对比4.1、D2 钢材4.2、D53 钢材4.3、7Cr13MoV 钢材4.4、对比…

奇怪的bug

奇怪的bug 合集 1.不可见字符集问题 起因是在自己做小项目的时候&#xff0c;通过lombok的data注解&#xff0c;默认生成实体类的get set方法 但是在某个方法中获取一个属性值的时候显示找不到该属性值的get方法&#xff0c;具体直接贴图 我以为是lombok的配置问题&#xff0c…