【D3.js - v5.x】(4)绘制饼图 | 附完整代码

vue项目基于D3js的3D饼图实现(一) 一个具有鼠标滑过提示框,图例联动,图例翻页的3D饼图 阅读详情

饼图

https://www.d3js.org.cn/document/d3-shape/#pies

定义一个布局:

var pie = d3.pie();

返回值赋给变量 pie,此时 pie 可以当做函数使用。

var piedata = pie(dataset);

将数组 dataset 作为 pie() 的参数,返回值给 piedata。如此一来,

piedata 就是转换后的数据。

5 个整数被转换成了 5 个对象(Object) ,每个对象都有变量起始角度(startAngle)和终止角度(endAngle),还有原数据(属性名称为 data)。这些都是绘图需要的数据。

记住:布局是为了得到绘图所需的数据。

绘制图形

为了根据转换后的数据 piedata 来作图,还需要一样工具:生成器

SVG 有一个元素,叫做路径 path,是 SVG 中功能最强的元素,它可以表示其它任意的图形。

顾名思义,路径元素就是通过定义一个段“路径”,来绘制出各种图形。

但是,路径是很难计算的,通过布局转换后的数据 piedata 仍然很难手动计算得到路径值。为我们完成这项任务的,就是生成器。

这里要用到的叫做弧生成器,能够生成弧的路径,因为饼图的每一部分都是一段弧。https://www.d3js.org.cn/document/d3-shape/#arcs

arc 生成器用来在饼图或圆环图中生成 circular(圆形) 或 annular(环形) 扇形。

var outerRadius = 150; //外半径
var innerRadius = 0; //内半径,为0则中间没有空白
var arc_generator = d3.arc()
                .innerRadius(0)
                .outerRadius(100); 

弧生成器返回的结果赋值给 arc。此时,arc 可以当做一个函数使用,把 piedata 作为参数传入,即可得到路径值。

接下来,可以在 SVG 中添加图形元素了。先在 svg 里添加足够数量(5个)个分组元素(g),每一个分组用于存放一段弧的相关元素。

var g = svg.append("g")             .attr("transform","translate("+marge.top+","+marge.left+")");
var gs = g.selectAll(".g")
                .data(pieData)
                .enter()
                .append("g")               	.attr("transform","translate("+width/2+","+height/2+")")//位置信息

接下来对每个 g 元素,添加 path 。

gs.append("path")
  .attr("d",function(d){
  return arc_generator(d);//往弧形生成器中出入数据
})
  .attr("fill",function(d,i){
  return colorScale(i);
});

因为 arcs 是同时选择了 5 个 g 元素的选择集,所以调用 append(“path”) 后,每个 g 中都有 path 。路径值的属性名称是 d,调用弧生成器后返回的值赋值给它。要注意,arc(d) 的参数 d 是被绑定的数据。

另外,color 是一个颜色比例尺,它能根据传入的索引号获取相应的颜色值,定义如下。

//设置一个color的颜色比例尺,为了让不同的扇形呈现不同的颜色
var colorScale = d3.scaleOrdinal()
                .domain(d3.range(dataset.length))
                .range(d3.schemeCategory10);

然后在每一个弧线中心添加文本:

gs.append("text")
                .attr("transform",function(d){//位置设在中心处
                    return "translate("+arc_generator.centroid(d)+")";
                })
                .attr("text-anchor","middle")
                .text(function(d){
                    return d.data;
                })

arc.centroid(d) 能算出弧线的中心。要注意,text() 里返回的是 d.data ,而不是 d 。因为被绑定的数据是对象,里面有 d.startAngle、d.endAngle、d.data 等,其中 d.data 才是转换前的整数的值。

在这里插入图片描述

完整代码:

<body>
        <svg width="500" height="500"></svg>
        <script>
            var marge = {top:60,bottom:60,left:60,right:60}
            var svg = d3.select("svg")
            var width = svg.attr("width")
            var height = svg.attr("height")
            var g = svg.append("g")
                .attr("transform","translate("+marge.top+","+marge.left+")");
                
            var dataset = [ 30 , 10 , 43 , 55 , 13 ];
            
            //设置一个color的颜色比例尺,为了让不同的扇形呈现不同的颜色
            var colorScale = d3.scaleOrdinal()
                .domain(d3.range(dataset.length))
                .range(d3.schemeCategory10);
            
            //新建一个饼状图
            var pie = d3.pie();
            
            //新建一个弧形生成器
            var innerRadius = 0;//内半径
            var outerRadius = 100;//外半径
            var arc_generator = d3.arc()
                .innerRadius(0)
                .outerRadius(100);
                
            //将原始数据变成可以绘制饼状图的数据,
            var pieData = pie(dataset);
            
            //在浏览器的控制台打印pieData
            console.log(pieData);
            
            //在有了绘制饼状图必须的数据后,我们就可以开始绘制了
            var gs = g.selectAll(".g")
                .data(pieData)
                .enter()
                .append("g")
                .attr("transform","translate("+width/2+","+height/2+")")//位置信息
                
            //绘制饼状图的各个扇形
            gs.append("path")
                .attr("d",function(d){
                    return arc_generator(d);//往弧形生成器中出入数据
                })
                .attr("fill",function(d,i){
                    return colorScale(i);
                });
                
            //绘制饼状图上面的文字信息
            gs.append("text")
                .attr("transform",function(d){//位置设在中心处
                    return "translate("+arc_generator.centroid(d)+")";
                })
                .attr("text-anchor","middle")
                .text(function(d){
                    return d.data;
                })
            
        </script>
      </body>

在这里插入图片描述

JS,统计图表大全--三、饼形图(饼图及环形图) HTML参考 <!DOCTYPE HTML> <html> <head> <meta charset="utf-8"><link rel="icon" href="https://jscdn.com.cn/highcharts/images/favicon.ico"> <meta name="... 阅读详情

相关推荐

利用 d3.js 绘制柱形图、折线图、散点图、饼图和力导图

下载d3.js文件:https://d3js.org/d3.v5.min.js 柱形图 折线图 散点图 饼图 力导图 一、动态效果柱形图 效果图: 代码: <html><head> <meta charset="utf-8"> <title>带有交互的柱形图</title> <style> ...

weixin_44947339的博客 2239

可视化工具D3.js教程 入门 (第十一章)—— 饼图

可视化工具D3.js教程 入门 (第十一章)—— 饼图 首先我们先梳理下 绘制饼图之前 需要掌握的新知识: 1、d3.arc——创建一个新的 arc 生成器 d3.arc(arguments ) 生成器用来在饼图或圆环图中生成 圆形 或 扇形 或 环形; arguments 是任意的; 它们只是简单地传递到 arc 生成器的访问器函数的对象。例如,根据默认的设置,传入的对象应该包含以下半径和角度信息:   arc({   innerRadius: 0,   outerRadius: 100,

weixin_44867717的博客 3426

D3.js绘制飞线总结

项目中多次遇到飞线的需求,故此抽个时间做个总结。 参考文章 : svg之path详解 地图与飞线 一根飞线的故事-SVG篇

You_Ta的博客 4270

JS-ECharts-前端图表 多层级联合饼图、柱状堆叠图、柱/线组合图、趋势图、自定义中线、平均线、气泡备注点

JavaScript编码,使用ECharts绘制前端图表:多层级联合饼图、柱状堆叠图、柱/线组合图、趋势图、自定义中线、平均线、气泡备注点、自定义数据分类占比、批注内容等

君琴 的博客 4518

D3 v3到v5需要了解的变化

v3 → v5 改动 js url <script src="https://d3js.org/d3.v3.js"></script> <script src="https://d3js.org/d3.v5.js"></script> style selection.style({ width:'100%', height:'30...

前端漫漫兮 3546

d3.js 好看的饼图,多层边框,装饰点

d3.js 好看酷炫的饼图,多层边框,装饰点,围绕饼图生成文字。多颜色文字

D3.js v5.0 3D饼图

3D的饼图主要可看成 2D饼图(最上层)+外曲面组成。 3D的环形饼图主要可看成 2D饼图(最上层)+外曲面+内曲面组成。 所以渲染也分为了几部分。 #render.js import * as d3 from 'd3'; import { draw, transition } from './renderUtil'; const salesData = [ { label: 'Basi...

m0_37777005的博客 8322

JS饼状图效果

插件描述:基于highcharts.js实现的饼状图效果,报表. 参考示例:http://www.jq22.com/jquery-info4506

HTML和JavaScript的D3绘制百分比饼图

今天,接着补齐发文任务,这次是绘制一个百分比数据饼图。 代码如下: <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>D3绘图</title> </head> <body> <script src="./d3.v4.min.js" charset="UTF-8"></script> <scri

Forerunner and Successor 先駆者と後継者 881

国产麒麟系统各版本镜像下载

以上各链接均为迅雷下载,禁止商业用途!

2302_79474754的博客 6102

C语言练习题:据说一个人的标准体重应该是其身高(单位:厘米)减去100、再乘以0.9所得到的公斤数。已知市斤的数值是公斤数值的两倍。现给定某人身高,请你计算其标准体重应该是多少?

题目内容: 据说一个人的标准体重应该是其身高(单位:厘米)减去100、再乘以0.9所得到的公斤数。已知市斤的数值是公斤数值的两倍。现给定某人身高,请你计算其标准体重应该是多少?(顺便也悄悄给自己算一下吧……) 输入格式: 输入第一行给出一个正整数H(100 < H ≤ 300),为某人身高。 输出格式: 在一行中输出对应的标准体重,单位为市斤,保留小数点后1位。 输入样例: 169 输出样例: 124.2 代码如下: #include<stdio.h> int main() { i

weixin_44877226的博客 2万+

D3.js的v5版本入门教程(第一章)—— 如何在项目中使用D3.js

D3.js的v5版本入门教程(第一章)     1、需要的一些工具         这个其实随便!最简单的就是建一个.txt文件就可以敲起代码来!作者本人用的是myeclipse(主要需要安装tomcat),因为写的是前端,一个浏览器查看效果当然是不可少的,建议使用chrome 浏览器,其强大的调试功能可以让你事半功倍!     2、需要预备的知识         如果你是编程小白,那么这...

数星星等天明的博客 2万+

微信小程序审核避坑指南:巧用 wx.getAccountInfoSync 实现审核与线上环境无感切换

本文详细介绍了如何利用`wx.getAccountInfoSync`API实现微信小程序审核与线上环境的无感切换。通过环境识别技术和动态渲染架构设计,开发者可以优雅解决审核资质门槛问题,同时保持生产环境的完整用户体验。文章包含组件化实现、全局状态管理等实用方案,帮助开发者提升审核通过率。

weixin_30527423的博客 259

【D3.js - v5.x】(5)绘制力导向图 | 附完整代码

力导向图 力导向图(Force-Directed Graph),是绘图的一种算法。 在二维或三维空间里配置节点,节点之间用线连接,称为连线。各连线的长度几乎相等,且尽可能不相交。 节点和连线都被施加了力的作用,力是根据节点和连线的相对位置计算的。 根据力的作用,来计算节点和连线的运动轨迹,并不断降低它们的能量,最终达到一种能量很低的安定状态。 力导向图能表示节点之间的多对多的关系。 初始数据如下:......

前端进阶之路 | 中大厂、外企、国企内推 | 面试培训 | 简历修改 6225

分析以太网帧结构_100G以太网接口调试初体验

是的,标题没有多敲一个“0”,明人不说暗话,就是在FPGA上实现100G以太网接口设计。正好参与了实验室某项目中的100G接口的调试,早想写个专栏文章了,由于调试过程中发现了一些硬件问题,导致迟迟没有往前推进,现在问题解决了之后可以简单分享一下100G以太网接口的调试初体验了~(好像DDR4读写测试系列文章还没搞完 )这篇初体验暂时不分多个章节了,基本设计流程与之前发布的“10G以太网接口”系列文...

weixin_39574050的博客 1601

深入解析BLheli电调固件与Dshot通讯协议:从原理到实践

本文深入解析了无人机动力系统的核心——BLheli电调固件与Dshot通讯协议。详细阐述了BLheli固件从经典版到BLheli_32的演进及其功能特性,并重点剖析了Dshot数字协议如何通过数据包和校验码实现更快、更准、更可靠的电机控制。文章还涵盖了双向Dshot遥测、实战配置与调参指南,帮助玩家充分释放无人机性能。

weixin_28273593的博客 434

D3.js v5.0 饼图与环形图(一)

/* eslint-disable no-param-reassign */ import * as d3 from 'd3'; export default function pieChart(id, dataset) { const width = 400; const height = 400; const fontsize = 14; const svg = d3 ...

m0_37777005的博客 1330

基于docker进行安装部署seata,解决Seata的版本与Nacos的版本不匹配

本文分享了在Docker环境下部署Seata时遇到Nacos 3.x API不兼容问题的解决方案。由于Seata 2.0.0内置的nacos-client 1.4.2无法调用Nacos 3.x重构后的接口,导致注册失败。通过下载Seata 2.6.0源码自行构建Docker镜像,并调整启动方式(直接执行Java命令绕过Shell脚本),最终成功实现与Nacos 3.x的集成。关键步骤包括:创建自定义Dockerfile、配置application.yml、处理启动脚本兼容性问题,最终采用java直接运行方案

Dd52698的博客 405

用d3.js+svg绘制房间人数热力图

根据数据表格绘制热力图是d3.js的拿手好戏。 本文用存放在csv文件中的表格数据,绘制各个房间内人数的热力图 图形效果如下: 数据文件内容: personNumber.csv name,room1,room2,room3,room4,room5,room6,room7,room8,room9,room10,room11,room12,room13,room14,room15,room16,ro...

littlezhuhui的专栏 3573

基于 YOLOv26 的陶瓷产品缺陷检测系统:智能视觉质检方案

本文提出了一种基于YOLOv26深度学习模型的陶瓷产品智能缺陷检测系统。该系统针对陶瓷生产中的裂纹、气泡、釉面缺陷等8类常见质量问题,采用YOLOv26目标检测算法实现高精度自动化检测。系统架构包含数据采集、预处理、YOLOv26检测和后处理四个模块,具有多类别分类、实时推理和强鲁棒性等技术优势。文章详细介绍了数据预处理与增强方法,并提供了Python代码实现示例。该方案可显著提升陶瓷产品质量检测效率,替代传统人工检测方式,为陶瓷制造业提供智能化质检解决方案。

一键难忘的博客 786

【AIGC】大模型面试高频考点07-注意力(Attention)篇

AIGC面试高频考点

一个内容严谨、方向前沿、极具实践价值的AI大模型技术分享站 3361

D3.js v5.0 旭日图

数据结构: { "name": "flare", "children": [ { "name": "", "children": [ { "name": "", "children": [ { "name": "", "...

m0_37777005的博客 2309

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

【D3.js - v5.x】(6)绘制树状图 | 层级布局 | 附完整代码

树状图 在d3 中,绘制树状图,要用到层级布局这个概念: d3.hierarchy(data[, children]) 根据指定的层次结构数据构造一个根节点。指定的数据 data 必须为一个表示根节点的对象。比如: { "name": "Eve", "children": [ { "name": "Cain" }, { "name": "S.........

前端进阶之路 | 中大厂、外企、国企内推 | 面试培训 | 简历修改 6389

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

假人有限元模型

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

D3JS可视化入门

文章目录安装和配置安装d3js本地服务器调试基本操作数据加载数据绑定数据SVG条形图散点图定义坐标轴更新视图增加数据字典绑定事件监听自动排序提示条布局饼图堆叠柱状图力图地图 安装和配置 安装d3js 在d3js的官网上可以直接下载d3js的文件,其中包含一个完整版和mini版,差别并不是很大。调试的时候可以使用完整版,发布的时候可以使用mini版,提高加载速度 本地服务器调试 可以利用python...

Peter_Luoz的博客 2万+

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

D3.js的v5版本入门教程(第九章)——完整的柱状图

D3.js的v5版本入门教程(第九章)          一个完整的柱状图应该包括的元素有——矩形、文字、坐标轴,现在,我们就来一一绘制它们,这章是前面几章的综合,这一章只有少量新的知识点,它们是 d3.scaleBand():这也是一个坐标轴,可以根据输入的domain的长度,等分rangeRound域(类比range域) d3.range():这个比较复杂,建议去看百度(或者官方API...

数星星等天明的博客 1万+

vue项目基于D3js的3D饼图实现

【代码】vue项目基于D3js的3D饼图实现。

xzy__007的博客 1058
上一篇: 【D3.js - v5.x】(3)Update & Enter & Exit | 交互 | 布局
下一篇: 【D3.js - v5.x】(5)绘制力导向图 | 附完整代码
蟹蟹蟹风流
蟹蟹蟹风流 优质创作者: 编程框架技术领域 优质创作者: 编程框架技术领域 领域专家: 前端开发技术领域 领域专家: 前端开发技术领域
博客等级 码龄11年 3万+粉丝 396原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蟹蟹蟹风流

期望和你分享一杯咖啡

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值