Python通过matplotlib画双层饼图及环形图简单示例


Posted in Python onDecember 15, 2017

(1)

饼图(pie),即在一个圆圈内分成几块,显示不同数据系列的占比大小,这也是我们在日常数据的图形展示中最常用的图形之一。

在python中常用matplotlib的pie来绘制,基本命令如下所示(python3.X版本):

vals = [1, 2, 3, 4]#创建数据系列
fig, ax = plt.subplots()#创建子图
labels = 'A', 'B', 'C', 'D'
colors = ['yellowgreen', 'gold', 'lightskyblue', 'lightcoral']
explode = (0, 0.1, 0, 0)
ax.pie(vals, explode=explode, labels=labels, colors=colors,
 autopct='%1.1f%%', shadow=True, startangle=90,radius=1.2)
ax.set(aspect="equal", title='Pie plot with `ax.pie`')#设置标题以及图形的对称
plt.show()

Python通过matplotlib画双层饼图及环形图简单示例

上图是在对饼图的模块颜色、标签、百分比、标题、角度、圆形半径,以及某一块凸出(explode)进行设置后,最终呈现的图形效果。大部分设置来自于pie()函数内,即:

pie(x, explode=None, labels=None, colors=None, autopct=None, pctdistance=0.6,
shadow=False, labeldistance=1.1, startangle=None, radius=None)

对于该函数内各参数的含义,网上资料比比皆是,在这里不再赘述,大家可以根据自己需求来多次尝试,设置美化图形。

(2)

目前matplotlib中尚无双层饼图绘制的专门介绍,但是,我们注意到pie()函数中有个饼图半径的设置——radius,于是,我就想:可不可以在同一个figure下绘制两个不同的圆饼,形成嵌套饼图,从而制作出双层饼图?比如:

作图如下:

vals1 = [1, 2, 3, 4]
vals2 = [2, 3, 4, 5]
fig, ax = plt.subplots()
labels = 'A', 'B', 'C', 'D'
ax.pie(vals1, radius=1.2)
ax.pie(vals2, radius=1)
ax.set(aspect="equal", title='Pie plot with `ax.pie`')
plt.show()

Python通过matplotlib画双层饼图及环形图简单示例

初战告捷!令我信心大增!
因此,在matplotlib下绘制双层饼图的方法可以总结为:基于不同的数据系列,分别设计两个饼图,嵌套在一起,对每个饼图的pie()函数内参数radius进行设置,就可以得到双层饼图。

(3)

但是,可以看到上面的那个图形还有点粗糙,还可以加入百分比、color等等,进一步设置:

vals1 = [1, 2, 3, 4]
vals2 = [2, 3, 4, 5]
fig, ax = plt.subplots()
labels = 'A', 'B', 'C', 'D'
ax.pie(vals1, radius=1.2,autopct='%1.1f%%',pctdistance=0.9)
ax.pie(vals2, radius=1,autopct='%1.2f%%',pctdistance=0.5)
ax.set(aspect="equal", title='Pie plot with `ax.pie`')
#plt.legend()
plt.legend(labels,bbox_to_anchor=(1.05, 1), loc='best', borderaxespad=0.)
plt.show()

Python通过matplotlib画双层饼图及环形图简单示例

为方便,在这里没有对颜色、角度进行参数设置,后期若大家有兴趣,可以进一步加入不同参数再次设置。在这里主要说明的是:

1、图中各饼块的百分比数据,也在各自饼图中对pctdistance(百分比离圆形距离)进行不同设置,以便区分开,这里边也经过多次尝试;

2、对于各饼块颜色代表的数据系列标签,采用图例的方式plt.legend(),放在右边,不然饼图中展示的文本内容过多,会影响图形效果;

3、legend()的图例的位置可以通过关键字参数 loc 指定,bbox_to_anchor 关键字可让用户手动控制图例布局。 例如,如果你希望轴域图例位于图像的右上角而不是轴域的边角,则只需指定角的位置以及该位置的坐标系。

(4)

进一步地,在双层饼图的基础上,我又在想:可不可以绘制双层环形图。

在这里也就是转换一下思路:在两个饼图里边再加个小圆形图,并设置成白色背景。经过尝试,结果也如我所愿:

vals1 = [1, 2, 3, 4]
vals2 = [2, 3, 4, 5]
vals3=[1]
fig, ax = plt.subplots()
labels = 'A', 'B', 'C', 'D'
ax.pie(vals1, radius=1.2,autopct='%1.1f%%',pctdistance=0.9)
ax.pie(vals2, radius=1,autopct='%1.1f%%',pctdistance=0.75)
ax.pie(vals3, radius=0.6,colors='w')
ax.set(aspect="equal", title='Pie plot with `ax.pie`')
#plt.legend()
plt.legend(labels,bbox_to_anchor=(1, 1), loc='best', borderaxespad=0.)
plt.show()

Python通过matplotlib画双层饼图及环形图简单示例

其原理为:绘制三个嵌套饼图,其中最里边的饼图,设置半径较小,整个饼图只有一个变量,因此不会分割,同时将背景色设置成白色colors='w',如此,大功告成!

实际上,还可以进一步延伸,绘制多层饼图、多层环形图,其原理都是绘制半径不同的pie,并设置不同的参数。

总结

以上就是本文关于Python通过matplotlib画双层饼图及环形图简单示例的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站其他相关专题,如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!

Python 相关文章推荐
python的id()函数解密过程
Dec 25 Python
Python实现的一个自动售饮料程序代码分享
Aug 25 Python
以一段代码为实例快速入门Python2.7
Mar 31 Python
Python中MySQL数据迁移到MongoDB脚本的方法
Apr 28 Python
详解Python3操作Mongodb简明易懂教程
May 25 Python
利用Python3分析sitemap.xml并抓取导出全站链接详解
Jul 04 Python
python 搭建简单的http server,可直接post文件的实例
Jan 03 Python
django mysql数据库及图片上传接口详解
Jul 18 Python
python中的线程threading.Thread()使用详解
Dec 17 Python
Python解析多帧dicom数据详解
Jan 13 Python
Python IDLE或shell中切换路径的操作
Mar 09 Python
TensorFlow中如何确定张量的形状实例
Jun 23 Python
python绘制双柱形图代码实例
Dec 14 #Python
Python实现一个Git日志统计分析的小工具
Dec 14 #Python
用matplotlib画等高线图详解
Dec 14 #Python
Python数据结构与算法之图的广度优先与深度优先搜索算法示例
Dec 14 #Python
python实现发送邮件功能代码
Dec 14 #Python
python正则实现计算器功能
Dec 14 #Python
Python数据结构与算法之使用队列解决小猫钓鱼问题
Dec 14 #Python
You might like
《OVERLORD》手游英文版即将上线 手机上也能扮演骨王
2020/04/09 日漫
剖析 PHP 中的输出缓冲
2006/12/21 PHP
PHP学习资料汇总与网址
2007/03/16 PHP
PHP中通过加号合并数组的一个简单方法分享
2011/01/27 PHP
PHP的SQL注入实现(测试代码安全不错)
2011/02/27 PHP
yii框架源码分析之创建controller代码
2011/06/28 PHP
php数组函数序列之array_sum() - 计算数组元素值之和
2011/10/29 PHP
php curl获取https页面内容,不直接输出返回结果的设置方法
2019/01/15 PHP
ThinkPHP3.2.3框架实现执行原生SQL语句的方法示例
2019/04/03 PHP
PHP中Session ID的实现原理实例分析
2019/08/17 PHP
关于laravel 子查询 & join的使用
2019/10/16 PHP
javascript数组去重方法汇总
2015/04/23 Javascript
基于jquery实现的仿优酷图片轮播特效代码
2016/01/13 Javascript
JQUERY的AJAX请求缓存里的数据问题处理
2016/02/23 Javascript
nodejs的HTML分析利器node-jquery用法浅析
2016/11/08 NodeJs
详解angular2封装material2对话框组件
2017/03/03 Javascript
js禁止浏览器的回退事件
2017/04/20 Javascript
使用Angular CLI快速创建Angular项目的一些基本概念和写法小结
2018/04/22 Javascript
微信小程序排坑指南详解
2018/05/23 Javascript
JavaScript基础之this和箭头函数详析
2019/09/05 Javascript
JS XMLHttpRequest原理与使用方法深入详解
2020/04/30 Javascript
解决js中的setInterval清空定时器不管用问题
2020/11/17 Javascript
[48:51]完美世界DOTA2联赛PWL S2 Magma vs InkIce 第一场 11.28
2020/12/02 DOTA
[01:01:52]DOTA2-DPC中国联赛定级赛 SAG vs iG BO3第二场 1月9日
2021/03/11 DOTA
Python3.x对JSON的一些操作示例
2017/09/01 Python
Tensorflow卷积神经网络实例进阶
2018/05/24 Python
Python基础之函数的定义与使用示例
2019/03/23 Python
python反转列表的三种方式解析
2019/11/08 Python
PyQT5 emit 和 connect的用法详解
2019/12/13 Python
详解使用CSS3的@media来编写响应式的页面
2017/11/01 HTML / CSS
加拿大最大的箱包及旅游配件零售商:Bentley Leathers
2017/07/19 全球购物
佳能英国官方网站:Canon UK
2017/08/08 全球购物
局域网标准
2016/09/10 面试题
乡镇干部十八大感言
2014/02/17 职场文书
挂靠协议书范本
2014/04/22 职场文书
公司法定代表人授权委托书
2014/09/29 职场文书