楼主: zjying2000
3658 1

[程序分享] 有趣!如何用Python-matplotlib绘制双层饼图及环形图? [推广有奖]

  • 4关注
  • 15粉丝

已卖:937份资源

学科带头人

54%

还不是VIP/贵宾

-

威望
0
论坛币
5288 个
通用积分
585.8475
学术水平
34 点
热心指数
43 点
信用等级
29 点
经验
62629 点
帖子
897
精华
0
在线时间
3687 小时
注册时间
2010-10-5
最后登录
2026-1-22

楼主
zjying2000 在职认证  发表于 2017-6-24 11:10:14 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币

1

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

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

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

饼图.png

上图是在对饼图的模块颜色、标签、百分比、标题、角度、圆形半径,以及某一块凸出(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下绘制两个不同的圆饼,形成嵌套饼图,从而制作出双层饼图?比如:


作图如下:

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

原始饼图.png

初战告捷!令我信心大增!

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

(3)


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

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

美化的饼图.png

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

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

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

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

(4)

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


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

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

环形图.PNG

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

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

更多精彩内容,欢迎关注:知乎爬虫与数据分析专栏:https://zhuanlan.zhihu.com/zjying2000

简书:http://www.jianshu.com/u/2f376f777ef1


二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:Matplotlib matplot python plot TLI matplotlib 饼图 环形图

沙发
lianqu 发表于 2017-7-2 23:19:30
受教了!感谢楼主

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2026-1-28 04:38