(1)
饼图(pie),即在一个圆圈内分成几块,显示不同数据系列的占比大小,这也是我们在日常数据的图形展示中最常用的图形之一。
在python中常用matplotlib的pie来绘制,基本命令如下所示(python3.X版本):
1
2
3
4
5
6
7
8
9
|
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()
|
上图是在对饼图的模块颜色、标签、百分比、标题、角度、圆形半径,以及某一块凸出(explode)进行设置后,最终呈现的图形效果。大部分设置来自于pie()函数内,即:
1
2
|
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
2
3
4
5
6
7
8
|
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()
|
初战告捷!令我信心大增!
因此,在matplotlib下绘制双层饼图的方法可以总结为:基于不同的数据系列,分别设计两个饼图,嵌套在一起,对每个饼图的pie()函数内参数radius进行设置,就可以得到双层饼图。
(3)
但是,可以看到上面的那个图形还有点粗糙,还可以加入百分比、color等等,进一步设置:
1
2
3
4
5
6
7
8
9
10
|
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()
|
为方便,在这里没有对颜色、角度进行参数设置,后期若大家有兴趣,可以进一步加入不同参数再次设置。在这里主要说明的是:
1、图中各饼块的百分比数据,也在各自饼图中对pctdistance(百分比离圆形距离)进行不同设置,以便区分开,这里边也经过多次尝试;
2、对于各饼块颜色代表的数据系列标签,采用图例的方式plt.legend(),放在右边,不然饼图中展示的文本内容过多,会影响图形效果;
3、legend()的图例的位置可以通过关键字参数 loc 指定,bbox_to_anchor 关键字可让用户手动控制图例布局。 例如,如果你希望轴域图例位于图像的右上角而不是轴域的边角,则只需指定角的位置以及该位置的坐标系。
(4)
进一步地,在双层饼图的基础上,我又在想:可不可以绘制双层环形图。
在这里也就是转换一下思路:在两个饼图里边再加个小圆形图,并设置成白色背景。经过尝试,结果也如我所愿:
1
2
3
4
5
6
7
8
9
10
11
12
|
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()
|
其原理为:绘制三个嵌套饼图,其中最里边的饼图,设置半径较小,整个饼图只有一个变量,因此不会分割,同时将背景色设置成白色colors='w',如此,大功告成!
实际上,还可以进一步延伸,绘制多层饼图、多层环形图,其原理都是绘制半径不同的pie,并设置不同的参数。
总结
以上就是本文关于Python通过matplotlib画双层饼图及环形图简单示例的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站其他相关专题,如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!
原文链接:https://zhuanlan.zhihu.com/p/27442584