数据可视化D3系列——饼状图

简介: 饼状图是数据统计中经常用到的另一类图表,饼图可以直观地显示一个数据系列中各项的大小与各项总和的比例,本文将使用D3上手制作一个简单的饼状图什么是布局布局是D3中非常重要的内容,有了布局D3才能画出复杂的矢量图。但布局并不是直接绘制图形,只是将初始数据转换成容易画图的图形语言,画图工具能读懂图形语言来进行绘制。在绘制饼状图中,例如有一组数据[1, 2, 3],只依靠这些数据是画不出的,需要将这些数据转化为圆形的起始角度和终止角度,第一块的角度区域为[0, π/3],第二块的角度区域为[π/3, π]……绘制工具能根据这些角度值进行绘制。「布局只进行数据转换」D3还提供其他常用图表的

饼状图是数据统计中经常用到的另一类图表,饼图可以直观地显示一个数据系列中各项的大小与各项总和的比例,本文将使用D3上手制作一个简单的饼状图


什么是布局


布局是D3中非常重要的内容,有了布局D3才能画出复杂的矢量图。但布局并不是直接绘制图形,只是将初始数据转换成容易画图的图形语言,画图工具能读懂图形语言来进行绘制。


在绘制饼状图中,例如有一组数据[1, 2, 3],只依靠这些数据是画不出的,需要将这些数据转化为圆形的起始角度和终止角度,第一块的角度区域为[0, π/3],第二块的角度区域为[π/3, π]……绘制工具能根据这些角度值进行绘制。「布局只进行数据转换」

D3还提供其他常用图表的布局函数,比如「力导向图」(Force)、「弦图」(Chord)、「树状图」(Tree)、「直方图」(Histogram)、「分区图」(Partition)等,每种布局有对应的API


确定数据


表格数据是来自w3schools的2016年9月的浏览器使用率


浏览器 占比
Chrome 72.5%
IE 5.3%
Firefox 16.3%
Safari 3.5%
Opera 1.0%
Others 1.4%


对此设定以下二维数组装载这些数据


var dataset = [['Chrome', 72.5], ['IE', 5.3], ['Firefox', 16.3], ['Safari', 3.5], ['Opera', 1.0], ['Others', 1.4]];
复制代码


建立布局


  • 「d3.pie()」 构造一个新的饼布局


构建一个饼布局并接收数据


var pie = d3.pie()
            .sort(null) // 在创建布局的时候,默认排序数据从大到小,设为null可以按照数组默认顺序排序
            .value(function(d){
              return d[1]
            });
复制代码


把数据转换为饼图绘制所需要的数据


var piedata = pie(dataset);
console.log(piedata);
复制代码


在控制台输出piedata,看看转换后的数据



image.png


img


可以看到,原来的数据已经被转换成6组适合画图的数据


  • 「data」 —— 保留原有数据


  • 「index」 —— 序号


  • 「startAngle」 —— 一段弧的起始角度


  • 「endAngle」 —— 一段弧的终止角度


生成弧生成器


虽然有了角度,但目前还是很难画出我们想要的饼图,还要用到D3中的路径生成器。在svg中,path标签的路径数值往往十分复杂,手动去生成是不现实的,尤其是要生成各种复杂曲线的时候,好在D3提供了基本的路径生成器,有线段、区域、弧生成器等。画饼图的时候需要用到弧生成器,帮助我们把转换后的数据真正绘制出来


  • 「d3.arc()」 创建一个新的弧生成器


  • 「arc.innerRadius([radius])」 设置内部半径


  • 「arc.outerRadius([radius])」 设置外部半径


这里把画布的四分之一作为外部半径,内部半径设为0就是饼图,没错,设置大于0就是圆环图


var outerRadius = width / 4;
var innerRadius = 0;
var arc = d3.arc()
            .outerRadius(outerRadius)
            .innerRadius(innerRadius);


绘制饼图


跟之前一样,创建g组合标签后,把piedata数据绑定至g标签,这里要用到D3的内置颜色,「d3.schemeCategory10」选了10种颜色,方便我们随时使用,为饼图的不同区域填色,不必为想不出好的颜色搭配而烦恼,当然也可以自定义颜色



image.png



img


var arcs = svg.selectAll('g')
              .data(piedata)
              .enter()
              .append('g')
              .attr('transform', 'translate(' + width / 2 + ',' + height / 2 + ')');
// 调用内置颜色序列
var colors = d3.schemeCategory10;
arcs.append('path')
    .attr('fill', function(d, i){
      return colors[i];
    })
    .attr('d', function(d){
      return arc(d);
    });


在path标签中,给d属性赋予数据经过弧生成器处理的值,这样一个没有标注的饼图就完成了


image.png


img



添加标注


  • 「arc.centroid(arguments…)」 获取弧中心坐标


接下来给饼图加一些标注,以便更好地阅读图形,主要用到弧中心的概念,如下图,黑点就是每个弧的中心,利用**arc.centroid()**可以获取弧中心的坐标,并且这个坐标是相对圆形的相对坐标。有了这个坐标,可以很方便地在每个弧上添加文字标注


image.png


img


「arc.centroid(d)*是一个包含横坐标和纵坐标的数组*[x, y]」,给坐标乘以2倍以上的数值就把文字移到圆形外边


arcs.append('text')
    .attr('transform', function(d, i){
      var x = arc.centroid(d)[0] * 2.8;
      var y = arc.centroid(d)[1] * 2.8;
      return 'translate(' + x + ', ' + y + ')';
    })
    .attr('text-anchor', 'middle')
    .text(function(d){
      var percent = Number(d.value) / d3.sum(dataset, function(d){
        return d[1];
      }) * 100;
      return d.data[0] + ' ' + percent.toFixed(1) + '%';
    })


最后再加一些连线


arcs.append('line')
    .attr('stroke', 'black')
    .attr('x1', function(d){ return arc.centroid(d)[0] * 2; })
    .attr('y1', function(d){ return arc.centroid(d)[1] * 2; })
    .attr('x2', function(d, i){
      return arc.centroid(d)[0] * 2.5;
    })
    .attr('y2', function(d, i){
      return arc.centroid(d)[1] * 2.5;
    });


由于最后几个数据太小,标注文字会重叠到一起,这里做了一个判断处理来错开数据值较小的文字,最后的效果图如下所示


image.png


img

相关文章
|
4月前
|
机器学习/深度学习 数据可视化 搜索推荐
Matplotlib数据可视化图表
【7月更文挑战第11天】Python的Matplotlib库是数据可视化的首选工具,支持创建各种图表,如折线图、柱状图、散点图、饼图、箱线图、热图等。安装Matplotlib可使用`conda`或`pip`。通过简单代码示例展示了如何绘制这些图表,包括自定义样式、动态更新及保存图表为图片文件。数据可视化对于理解和传达数据洞察至关重要。
56 3
|
5月前
|
数据可视化 Python
利用Matplotlib绘制数据可视化图表
**摘要:** 本文介绍了Python的绘图库Matplotlib在数据分析和科学计算中的重要性。Matplotlib是一个开源库,提供类似MATLAB的接口,支持静态、动态和交互式图表的绘制,并能保存为多种格式。文章详细讲解了Matplotlib的基本用法,包括安装库、导入模块和绘制简单折线图的步骤。还展示了如何绘制柱状图并添加数据标签。通过这些例子,读者可以了解如何利用Matplotlib进行数据可视化,并对其进行自定义以满足特定需求。
54 4
|
数据采集 数据可视化 BI
28个数据可视化图表的总结和介绍
在这篇文章中,我们将整理我们能看到的所有数据可视化图表。如果你是数据科学初学者,那么本文将是最适合你的。
202 0
28个数据可视化图表的总结和介绍
|
数据可视化
数据可视化平台Datart-创建柱状图
数据可视化平台、Datart
525 0
|
数据可视化 Python
Matplotlib数据可视化:折线图与散点图
Matplotlib数据可视化:折线图与散点图
Matplotlib数据可视化:折线图与散点图
|
SQL 数据可视化 算法
数据可视化—绘制简单的折线图
在使用matplotlib绘制简单的折线图之前首先需要安装matplotlib,直接在pycharm终端pip install matplotlib即可
258 0
数据可视化—绘制简单的折线图
|
前端开发 JavaScript 数据可视化
数据可视化——从0-1实现折线图(二)
画XY坐标轴 坐标轴本质上就是两条直线,所以第一步确定坐标原点,然后以坐标原点画出垂直和水平的两条直线。我们设置坐标原点离画布的左内边距和底部内边距,这样我们可以通过画布的高度减去底部内边距得到 原点的y, 然后通过画布的宽度减去左内边距得到x, 有了坐标原点画坐标轴就没什么大问题了。代码如下: //定义坐标轴相对于画布的内边距 this.paddingLeft = 30 // 至少大于绘制文字的宽度 this.paddingBottom = 30 // 至少大于绘制文字的高度 this.origin = new Point2d( this.paddingLeft,
数据可视化——从0-1实现折线图(二)
|
前端开发 数据可视化 JavaScript
数据可视化——从0-1实现折线图(一)
前言 终于又到周末了,上一周的一篇3d文章 带你入门three.js——从0到1实现一个3d可视化地图很开心😺收到了这么多小伙伴的喜欢,这是对我知识输出的肯定。再次感谢大家!这周我又来了,这次给大家分享一下可视化图表比较简单的图表📈但同时我们又不得不学会的 那就是————「折线图」。读完本篇文章你可以学到什么 js实现直线方程 折线图的表达 canvas的一些api灵活的运用 直线折线图 我们先去非常有名的Echarts 官网看一看,他的折线图是什么样子的?如图: 图片 echats折线图 从图中可以得到以下2d图形元素: 直线(两个端点是圆的) 直线(两个端点是直线的) 文字 好
数据可视化——从0-1实现折线图(一)
|
数据可视化 Python
数据可视化之matplotlib绘制饼状图
数据可视化之matplotlib绘制饼状图 常常为Python的数据可视化而痴迷,将数据进行可视化只需要掌握相关库的方法使用即可。流水线式的库式调用实现正是显示python强大的库的功能。我们可以绘制各种各样的数据图样式,对于数据的反应更加直观而准确。
441 0
数据可视化之matplotlib绘制饼状图
|
算法 数据可视化 前端开发