echarts实现复合饼图

vue+echarts实现有关联关系的复合饼图 【代码】vue+echarts实现有关联关系的复合饼图。 阅读详情
AI摘要

本文介绍如何使用ECharts实现复合饼图,并详细介绍利用嵌套环形图和markLine属性来绘制连接线的过程。

Echart 复合饼图

要实现如Excel中一样的复合饼图,但发现echarts中并没有相关样例,故根据配置项自行实现

实现思路

  1. 利用echarts中的嵌套环形图进行修改
    在这里插入图片描述
    1.1. 将中间内圆进行平移,构成复合饼图的详细子图,通过media 属性实现
media: [
    {
      query: { minAspectRatio: 1 },
      option: {
        series: [
          { center: ['70%', '50%'] },
          { center: ['30%', '50%'] },
        ]
      }
    }
  ],

实现效果:
在这里插入图片描述
2. 接下来就是要为右边的圆以及左边对应的扇形增加连线,这里用到的markline属性,可以在图中增加自定义的线条.
线的起点在左边扇形边界,线的终点在圆的边上。
因为比较懒,懒得计算,所以右边圆上的终点直接写死了。
所以接下来的重点在于获取到左边扇形的上下边界坐标点:

  • 首先需要获取到环形图的属性,需要在图初次完成渲染时获取到图的信息,找到环形图的_itemLayouts属性,该属性拥有每个扇形圆心坐标,半径值,开始角度,结束角度
  • 根据获得的圆心坐标(cx , cy),半径值(r),开始角度(startAngle),结束角度 (endAngle)计算扇形的边界坐标,然后更新markLine的起始点就可以得到从扇形到圆的连线
    • 计算方式:
      • 开始边界x坐标(x1)= 圆心x坐标 + cos(开始角度) * 半径值
      • 开始边界y坐标(y1)= 圆心y坐标 + sin(开始角度) * 半径值
      • 结束边界x坐标(x2)= 圆心x坐标 + cos(结束角度) * 半径值
      • 结束边界y坐标(y2)= 圆心y坐标 + sin(结束角度) * 半径值
    • 得到(x1, y1),(x2, y2)之后,将值以及之前定好的终点圆的边界坐标写到配置项markLine中,就可以得到复合饼图
  1. 最终效果
    在这里插入图片描述

代码(可复制到codeSandbox中运行)

import "./styles.css";
import React, {useRef, useMemo, useEffect, useState} from 'react';
import ReactEcharts from 'echarts-for-react';

export default function App() {
  const [chartView, setChartView] = useState(null);
  const myCharts = useRef(null);

  useEffect(()=>{
    window.addEventListener('resize', chartResize);
    return () =>{window.removeEventListener('resize', chartResize);}
  }, [])

  const chartResize = () => {
    setChartView(null);
    myCharts && myCharts.current.getEchartsInstance().resize();
  }

  const chartOptions = useMemo(() => {
    console.log('111',chartView)
    let changePos = false;
    let pos = {};
    if (chartView) {
      changePos = true;
      let tmp = chartView[1]._data._itemLayouts[0];
      pos.startTop = {x: tmp.cx + Math.cos(tmp.startAngle) * tmp.r, y: tmp.cy + Math.sin(tmp.startAngle) * tmp.r}
      pos.startBootom = {x: tmp.cx + Math.cos(tmp.endAngle) * tmp.r, y: tmp.cy + Math.sin(tmp.endAngle) * tmp.r} 
    }
    return {
      tooltip: {
        trigger: 'item',
        formatter: '{a} <br/>{b}: {c} ({d}%)'
      },
      legend: {
        data: [
          'Direct',
          'Marketing',
          'Search Engine',
          'Email',
          'Baidu',
        ]
      },
      series: [
        {
          name: 'Access From',
          type: 'pie',
          selectedMode: 'single',
          radius: [0, '30%'],
          label: {
            show: false,
            position: 'inner',
            fontSize: 14
          },
          labelLine: {
            show: false
          },
          data: [
            { value: 1548, name: 'Search Engine' },
            { value: 775, name: 'Direct' },
            { value: 679, name: 'Marketing' }
          ]
        },
        {
          name: 'Access From',
          type: 'pie',
          radius: ['45%', '60%'],
          label: {
            show: false
          },
          labelLine: {
            length: 30
          },
          startAngle: 60,
          data: [
            { value: 1048, name: 'Baidu' },
            { value: 2046, name: 'Email' },
          ],
          markLine:{
            silent: true,
            symbol: 'none',
            data: [
              [
                {x: changePos ? pos.startTop.x : '30%', y: changePos ? pos.startTop.y :47},
                {x: '70%', y: 84}
              ],
              [
                {x: changePos ? pos.startBootom.x :'30%', y: changePos ? pos.startBootom.y :193},
                {x: '70%', y: 157}
              ]
            ]
          }
        }
      ],
      media: [
        {
          query: { minAspectRatio: 1 },
          option: {
            series: [{ center: ['70%', '50%'] }, { center: ['30%', '50%'] }]
          }
        }
      ]
    }
  }, [chartView])

  const onChartReady = ($event) => {
    console.log($event._chartsViews)
    if (!chartView) {
      setChartView($event._chartsViews)
    }
  }

  return (
    <div className="App">
      <ReactEcharts 
        ref={myCharts}
        style={{height: 240, width: '100%'}} 
        opts={{renderer: 'svg'}} 
        option={chartOptions} 
        onChartReady={(event)=>{onChartReady(event)}}
        // 需要加onEvents,不然onChartReady不生效
        onEvents={{resize: ()=>{console.log('resize')}}}
      />
    </div>
  );
}

基于ECharts的饼图交互可视化开发 饼图是一种广泛用于数据可视化的图表类型,它可以直观地展示不同数据项在整体中的占比。本文将介绍如何使用ECharts开发一个交互式饼图,该饼图允许用户通过鼠标点击和悬停操作来获取数据详情。饼图数据可视化:将数据项以饼图的形式展示,每个扇形代表一个数据项。鼠标悬停提示:当鼠标悬停在某个扇形上时,将显示该扇形所代表的数据值。扇形选中:当用户点击某个扇形时,该扇形将被选中,并显示更详细的数据信息。在option// ...在label配置中,设置formatter函数来自定义标签内容。rich。 阅读详情

相关推荐

Echarts报表实现与实战案例

ECharts,一个由百度开源的数据可视化库,提供了简单、直观、丰富的数据展示方式,适合各种复杂的数据需求。它的轻量级、易配置和多样的交互性使其在数据可视化领域受到了广泛欢迎。在数据可视化过程中,图表的样式直接影响着最终的视觉呈现和观众的阅读体验。一个精心设计的图表样式可以让数据更加生动,更能吸引观众的注意力,甚至能提升数据的可读性和解释性。因此,自定义图表样式的实现是ECharts实践中的一个重要方面。实现自定义样式需要遵循以下基本原则:一致性原则。

weixin_28713083的博客 1707

vue中用echarts实现复合饼图,带关系连接线

echarts 复合饼图,带关系线

zhuangjiajia09的专栏 8538

基于云开发的微信小程序个人财务系统从0到1实战指南

数据库设计是软件开发中决定数据质量与系统扩展性的基石,尤其在涉及敏感财务数据的应用场景中,良好的表结构设计能有效避免精度丢失、数据冗余和权限泄露等问题。个人财务管理系统作为典型的业务型应用,完整覆盖了前端交互、数据持久化、聚合统计与可视化呈现的全链路。通过微信小程序云开发平台,开发者可以将数据库、云函数与存储能力一体化集成,利用集合权限实现用户数据隔离。从账单录入的金额整数化存储,到基于聚合管道的分类占比统计,再到ECharts饼图的动态渲染,以及预算超支的定时订阅消息提醒,整个系统演示了如何将工程化思维融

weixin_29313423的博客 219

echarts模仿excel复合饼图(饼-饼)

1. echarts保存地址 https://www.makeapie.com/editor.html?c=xlJ8p_1rlC 2.写的时候准备用echarts点击事件获取圆点坐标及角度;之后发现拿到的角度不是我想要的0-360之间的角度,再接着没找到可以主动触发echartst图形点击事件的方案,所以后面改成圆点坐标及角度自己获取;连线已实现,图形自适应待优化。 let markLineData = [] let source = [ ['product', '2015', '2016'],

qq_42014441的博客 3157

echarts复合饼图,堆叠柱状图

echarts复合饼图(没有边线),堆叠柱状图,柱状图

ECharts柱状图和饼图实现案例

使用ECharts+Java实现的完整案例,包括实现柱状图和饼图,代码完整,有数据库文件,数据库为Oracle

echarts中一个option配置两个图形(饼图,柱图)

  var arr_name = new Array(); var arr_value = new Array(); for (var i = 0; i &lt; data.length; i++) { arr_name.push(data[i].name); arr_value.p...

admin_1027的博客 7802

Seurat 单细胞转录组测序数据分析教程(三)——python(scanpy)

文章参考至,做了一个更详细的解读。本教程探讨了 scanpy 的可视化可能性,分为三个部分:嵌入的散点图(例如 UMAP、t-SNE)使用已知标记基因鉴定簇差异表达基因的可视化在本教程中,我们将使用来自 10x 的数据集,其中包含来自PBMC的 68k 个细胞。Scanpy 在其分布中包括该数据集的简化样本,该数据集仅包含 700 个细胞和 765 个高度可变的基因。该数据集已经过预处理和 UMAP 计算。在本教程中,我们还将使用以下文献标记:B细胞:CD79A、MS4A1。

coffeeii的博客 5828

ECharts饼图hover效果优化:隐藏特定类别的tooltip提示技巧

本文详细介绍了ECharts饼图中如何优化hover效果,特别是隐藏特定类别的tooltip提示技巧。通过解析tooltip配置参数和formatter函数,实现精准控制提示框显示,适用于电商数据看板、金融分析等专业场景,提升数据可视化效果。

weixin_28523493的博客 232

稳定双共轭梯度法BiCGSTAB流程

稳定双共轭梯度法BiCGSTAB流程

abner361的博客 1154

arcgis select by attributes一次选多个_视频:如何基于ArcGIS与GeoDa求莫兰指数和绘制莫兰散点图?...

莫兰指数是全域莫兰指数(Global Moran's I)的简称,是澳大利亚统计学家帕特里克·阿尔弗雷德·皮尔斯·莫兰(Patrick Alfred Pierce Moran),在1950年提出的。详细介绍,如下:莫兰指数取值范围在-1.0至1.0之间。当Moran's I >0时,表示空间正相关性,其值越大,空间相关性越明显;当Moran's I <0时,表示空间负相关性...

weixin_39948247的博客 1760

echarts饼图制作

首先准备好一个div用来放echarts图 &amp;lt;div id=&quot;echartsImg&quot;&amp;gt; &amp;lt;/div&amp;gt; 在页面中导入echarts文件 &amp;lt;script th:src=“/water/js/echarts.js&quot; type=&quot;text/javascript&quot;&amp;gt;&amp

疯小子 961

【AirSim+PX4】WSL2上运行PX4连接Airsim步骤

在 Linux 命令行中输入以下命令以添加(或改变)环境变量。注意,此处的 IP 地址应为。4.启动 sln 文件的调试以进入 UE4 编辑器,并在 Linux 中启动 PX4。

m0_53538421的博客 1505

基于Flask与ECharts的警情数据可视化分析系统搭建指南

数据可视化是数据分析与业务决策的关键环节,通过Web技术将统计数据转化为直观图表,能显著提升信息传达效率。其核心原理在于:后端对结构化数据进行聚合计算,前端通过图表库将结果映射为可视化图形,从而实现动态交互式展示。在实际工程中,轻量级Web框架Flask结合MySQL存储与ECharts渲染,构成一套高效、易扩展的迷你BI系统。这类方案广泛应用于运维监控、运营看板、警务分析等场景,尤其适合处理周期性数据趋势、分类占比与区域对比等统计需求。本文以警情数据为例,完整演示从数据库设计、模拟数据生成、Flask接口

weixin_31220401的博客 304

Qlib数据获取避坑指南:从CSV导入到自定义数据源的完整解决方案

本文详细解析了Qlib数据获取的完整解决方案,从CSV导入到自定义数据源,涵盖了股票数据处理的关键技巧和常见陷阱。特别针对Qlib平台的数据格式要求和复权处理提供了实用指南,帮助量化投资者高效整合Wind等第三方数据源,确保数据质量与模型性能。

weixin_29047919的博客 304

【100%通过率】华为OD机试真题 Python 实现【网上商城优惠活动 / 模拟商场优惠打折II】

某网上商场举办优惠活动,发布了满减、打折、无门槛3种 优惠券,分别为: 1:每满100元优惠10元,无使用数限制,如100~199元可以使用1张减10元,200~299可使用2张减20元,以此类推; 2:92折券,1次限使用1张,如100元,则优惠后为92元, 3:无门槛5元优惠券,无使用数限制,直接减5元。

MISAYAONE的博客 9371

eacharts 饼图 嵌套联动

eacharts 饼图嵌套联动,点击内环数据时候,外圈数据跟随变动 主要是用到了点击事件方法 Eacharts.on('click', function (params) { if(params.data.id){ axios.get(ajaxURL.menaDetails,{ params:{ id:...

山外小楼 795

终于找到两个稳定好用的Docker镜像加速源,拉取速度提升几十倍!

国内使用Docker经常遇到镜像拉取慢、超时失败的问题🐳 本文分享两个亲测好用的免费镜像加速源⚡ 实测拉取速度从十几分钟缩短到几十秒,稳定性接近100%📊 支持一键配置脚本,支持多平台使用✨

XiaoqiangClub的博客 953

echarts嵌套饼图联动实现

echarts嵌套饼图联动实现 效果解释:当点击内部饼图时,外环饼图会跟随内部选择的饼图变化 效果图: 代码: <html> <head> <title>嵌套饼图联动</title> </head> <script type="text/javascript" sr...

weixin_30699465的博客 299

mapbox进阶,dem数据转为等高面,加载转换后的等高面到地图

本文详细介绍如何基于mapbox-gl v3.*.* 版本,使用dem数据转为等高面,加载转换后的等高面到地图,亲测可用。希望能帮助到您。一起学习,加油!加油!

我哎GIS博客 407

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

基于SSM框架的濒危动物保护系统设计与实现

SSM框架(Spring+SpringMVC+MyBatis)是Java企业级开发的主流技术栈,通过分层架构实现业务逻辑解耦。其核心原理是Spring的IoC容器管理Bean生命周期,MyBatis简化数据库操作,SpringMVC处理Web请求。这种组合特别适合需要展示完整MVC流程的毕业设计项目,既能体现技术深度又便于论文写作。在生态保护领域,结合ECharts可视化与MySQL空间数据管理,可构建专业的濒危动物信息管理系统。本系统采用IUCN标准分类体系,实现物种CRUD操作、多条件查询和种群趋势分析

weixin_32932149的博客 259

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

echars组合饼图

做成这种效果,做成组成饼图(其实是一个饼图)。

LoveZJC96的博客 519

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

基于SpringBoot+Vue3的前后端分离个人理财系统设计与实现

个人财务管理的第一步是清晰记录每一笔收支,而这背后涉及的数据建模、事务处理和可视化报表,恰好是后端开发与前端工程化能力的综合体现。从数据库表结构到金额精度控制,从动态SQL到统计聚合,一个理财系统不仅需要稳定存储账单数据,还要能按时间、分类等多维度输出趋势。SpringBoot与MyBatis的组合让复杂统计查询的SQL完全可控,Vue3配合ECharts则能直观呈现分类占比与月度收支曲线。无论是用于个人记账替代商业应用,还是作为前后端分离项目的练手作品,这套架构都兼顾了开发效率与生产可用性。文章完整展示了

weixin_31960565的博客 256

echarts饼图显示百分比_复合饼图和双层饼图的制作方法

Excel数据分析中,我们经常会用到饼状图,今天我们来分享一下复合饼图和双层饼图的制作方法。01 复合饼图复合饼图——从主饼图提取部分数值,并将其组合到另一个饼图中。复合饼图主要有两个作用:1.提高小百分比数据的可读性在Excel中插入饼图时,有时候会遇到这种情况,饼图中的一些数值占的百分比较小,如果将其放到同一个饼图中(如下图示例),小百分比数据较为密集不易看清。但小百分比的数据并不一定就是不重...

weixin_39949889的博客 4166

echart饼图标签重叠_Excel----太炫酷了,原来动态复合图可以这么做

效果图:制图大致思路如下:借用复合饼图利用函数自动获取数据区域借用控件来控制数据变化通过图表的叠加来完成详细制图步骤:第一步:插入控件在表格中插入两个选项按钮,点击开发工具——插入——表单控件——选项按钮,选中选项按钮,右击选择重新命名,并将其控件选择B7单元格。第二步:建立选项控件与数据之间联系选中单元格区域输入公式=IF($B$7=1,OFFSET($A$1,1,,4,1),TRANSPOSE...

weixin_34746495的博客 3558

echart vue 嵌套饼图_vue2.0实现echarts饼图(pie)效果展示

最近做的项目需要饼状图展示数据的功能,于是便引入echarts做了一个饼状图的效果展示。由于只用到echarts其中的饼图,所以就单独在需要的模块引用,避免全局引用影响性能,减少不必要的加载。一.使用 cnpm 安装 Echartscnpm install echarts -S二.HTML部分课程分布图(部门统计,岗位统计,人员统计,分类统计,类型统计)三.CSS部分.echarts-conten...

weixin_33303537的博客 1237
上一篇: Linux本地系统安装(三)互联网访问另外一台电脑上的虚拟机Linux
下一篇: 使用h5 drag api 实现拖动
JustMo_
博客等级 码龄10年 6粉丝 14原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值