Python Matplotlib绘制双层饼图与环形图实战指南
本文介绍如何使用Python的Matplotlib库绘制双层饼图和环形图。通过在同一画布中嵌套不同半径的饼图,并调整radius、pctdistance及legend参数,实现美观的多层数据展示。文章提供完整代码示例及关键参数解析,帮助开发者快速掌握复杂饼图的绘制技巧。
(1)
饼图(pie)是一种将圆形分割为若干扇区以展示各数据系列占比的图表,也是日常数据分析中最常见的可视化形式之一。
在Python中,通常使用matplotlib库的pie函数进行绘制。以下是基于Python 3.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()

上图展示了经过颜色、标签、百分比、标题、起始角度、半径以及部分扇区突出(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()

初步尝试成功,令人信心大增! 因此,在Matplotlib中绘制双层饼图的核心方法可以总结为:基于不同的数据系列分别构建两个饼图,通过嵌套方式组合,并对每个饼图的pie()函数中的radius参数进行差异化设置,即可生成双层饼图。
(3)
然而,观察上述图形会发现其细节尚显粗糙,我们可以进一步添加百分比标签、颜色区分等元素,并进行更精细的参数设置:
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)
在此基础上,进一步思考:是否可以在双层饼图的基础上绘制双层环形图?
解决思路如下:在两个嵌套饼图内部再添加一个中心小圆形图,并将其背景色设置为白色。经过实践,结果符合预期:
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绘制双层饼图及环形图的简单示例全部内容,希望能对大家有所帮助。感兴趣的朋友可继续查阅本站其他相关专题,如有不足之处,欢迎留言指正。感谢各位对本站的支持!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













