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内置的HTTP协议服务器SimpleHTTPServer使用指南
Mar 30 Python
python自动发邮件库yagmail的示例代码
Feb 23 Python
Python对多属性的重复数据去重实例
Apr 18 Python
Python字典中的键映射多个值的方法(列表或者集合)
Oct 17 Python
python3射线法判断点是否在多边形内
Jun 28 Python
python编程进阶之异常处理用法实例分析
Feb 21 Python
python如何导出微信公众号文章方法详解
Aug 31 Python
Python如何在bool函数中取值
Sep 21 Python
基于Python-Pycharm实现的猴子摘桃小游戏(源代码)
Feb 20 Python
Pytorch 使用tensor特定条件判断索引
Apr 08 Python
使用pandas或numpy处理数据中的空值(np.isnan()/pd.isnull())
May 14 Python
Python虚拟环境virtualenv是如何使用的
Jun 20 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边学边教》(04.编写简易的通讯录――视频教程1)
2006/12/13 PHP
php牛逼的面试题分享
2013/01/18 PHP
PHP实现登陆并抓取微信列表中最新一组微信消息的方法
2017/07/10 PHP
php curl上传、下载、https登陆实现代码
2017/07/23 PHP
PHP基于双向链表与排序操作实现的会员排名功能示例
2017/12/26 PHP
jquery实现树形二级菜单实例代码
2013/11/20 Javascript
简单的jquery左侧导航栏和页面选中效果
2014/08/21 Javascript
jQuery中:animated选择器用法实例
2014/12/29 Javascript
js实现完美兼容各大浏览器的人民币大小写相互转换
2015/10/29 Javascript
微信小程序 教程之小程序配置
2016/10/17 Javascript
浅谈js for循环输出i为同一值的问题
2017/03/01 Javascript
动态创建Angular组件实现popup弹窗功能
2017/09/15 Javascript
vue加载完成后的回调函数方法
2018/09/07 Javascript
小程序实现左右来回滚动字幕效果
2018/12/28 Javascript
解决layer.confirm快速点击会重复触发事件的问题
2019/09/23 Javascript
js实现轮播图效果 z-index实现轮播图
2020/01/17 Javascript
JavaScript中arguments的使用方法详解
2020/12/20 Javascript
使用Python爬取最好大学网大学排名
2018/02/24 Python
Python实现的knn算法示例
2018/06/14 Python
在Python中关于使用os模块遍历目录的实现方法
2019/01/03 Python
使用pyqt5 tablewidget 单元格设置正则表达式
2019/12/13 Python
Keras设定GPU使用内存大小方式(Tensorflow backend)
2020/05/22 Python
python利用faker库批量生成测试数据
2020/10/15 Python
如何用css3实现switch组件开关的方法
2018/02/09 HTML / CSS
HTML高亮关键字的实现代码
2018/10/22 HTML / CSS
AmazeUI 平滑滚动效果的示例代码
2020/08/20 HTML / CSS
一些网络技术方面的面试题
2014/05/01 面试题
简历中自我评价怎么写
2014/02/12 职场文书
五四青年节演讲稿
2014/05/26 职场文书
森林病虫害防治方案
2014/06/02 职场文书
最美护士演讲稿
2014/08/27 职场文书
河童之夏观后感
2015/06/11 职场文书
薪资证明范本
2015/06/19 职场文书
运动会运动员赞词
2015/07/22 职场文书
PyTorch梯度裁剪避免训练loss nan的操作
2021/05/24 Python
JavaWeb 入门篇:创建Web项目,Idea配置tomcat
2021/07/16 Java/Android