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使用any判断一个对象是否为空的方法
Nov 19 Python
简介Django框架中可使用的各类缓存
Jul 23 Python
Python中操作符重载用法分析
Apr 29 Python
Python基于pycrypto实现的AES加密和解密算法示例
Apr 10 Python
利用Python如何制作好玩的GIF动图详解
Jul 11 Python
Python中栈、队列与优先级队列的实现方法
Jun 30 Python
详解python中eval函数的作用
Oct 22 Python
Python Flask上下文管理机制实例解析
Mar 16 Python
Python面向对象魔法方法和单例模块代码实例
Mar 25 Python
520使用Python实现“我爱你”表白
May 20 Python
python中的插入排序的简单用法
Jan 19 Python
浅谈盘点5种基于Python生成的个性化语音方法
Feb 05 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
PHP实现阳历到农历转换的类实例
2015/03/07 PHP
jquery 获取json数据实现代码
2009/04/27 Javascript
Js 中debug方式
2010/02/07 Javascript
jquery ajax学习笔记2 使用XMLHttpRequest对象的responseXML
2011/10/16 Javascript
javascript删除option选项的多种方法总结
2013/11/22 Javascript
Jquery解析json数据详解
2013/12/26 Javascript
document.execCommand()的用法小结
2014/01/08 Javascript
javascript实例分享---具有立体效果的图片特效
2014/06/08 Javascript
jquery常用的12个小功能
2016/07/22 Javascript
浅谈js中test()函数在正则中的使用
2016/08/19 Javascript
bootstrap中使用google prettify让代码高亮的方法
2016/10/21 Javascript
JavaScript常用正则验证函数实例小结【年龄,数字,Email,手机,URL,日期等】
2017/01/23 Javascript
vue-resource 拦截器使用详解
2017/02/21 Javascript
node的process以及child_process模块学习笔记
2018/03/06 Javascript
浅谈angular表单提交中ng-submit的默认使用方法
2018/09/30 Javascript
详解Vue3.0 + TypeScript + Vite初体验
2021/02/22 Vue.js
[01:33]一分钟玩转DOTA2第三弹:DOTA2&DotA快捷操作大对比
2014/06/04 DOTA
[02:14]2016国际邀请赛中国区预选赛Ehome晋级之路
2016/07/01 DOTA
[03:06]2018年度CS GO最具人气解说-完美盛典
2018/12/16 DOTA
python+ffmpeg视频并发直播压力测试
2018/03/06 Python
基于python绘制科赫雪花
2018/06/22 Python
python实现反转部分单向链表
2018/09/27 Python
python 实现数字字符串左侧补零的方法
2018/12/04 Python
Python3直接爬取图片URL并保存示例
2019/12/18 Python
python Manager 之dict KeyError问题的解决
2019/12/21 Python
Python多线程操作之互斥锁、递归锁、信号量、事件实例详解
2020/03/24 Python
浅谈django 模型类使用save()方法的好处与注意事项
2020/03/28 Python
sort命令的作用和用法
2012/11/04 面试题
2014年高三毕业生自我评价
2014/01/11 职场文书
年会搞笑主持词
2014/03/27 职场文书
初中班主任经验交流材料
2014/05/16 职场文书
2014年幼儿园安全工作总结
2014/11/10 职场文书
如何写辞职书
2015/02/26 职场文书
小学秋季运动会通讯稿
2015/11/25 职场文书
js实现上传图片到服务器
2021/04/11 Javascript
MySQL数据库索引的最左匹配原则
2021/11/20 MySQL