Python利用matplotlib绘制圆环图(环形图)的实战案例

慢慢来
慢慢来
发布时间:2026-10-15 | 2人浏览过
原创

本文详细介绍如何使用Python的matplotlib库绘制圆环图(Donut Chart)。文章从圆环图与饼图的对比入手,通过空气质量评级数据展示实战案例,深入解析wedgeprops、startangle及text等关键参数的用法,并提供完整代码与效果演示,帮助读者掌握多环对比与内部标注技巧。

一、概念介绍

圆环图,亦称环形图或甜甜圈图,是由饼图演变而来。其单环结构与饼图功能相似,主要用于展示定性数据中各个子类占整体的比例关系。

Q:既然已有饼图,为何还需要圆环图?

① 从空间利用角度看,饼图的文本通常需通过指示线标注在图形外部;而圆环图利用中间挖空的设计,可将标题或各类别文本直接置于环内,更便于多图排列与对比。

② 从视觉效果看,若仅展示一维定性数据,饼图与圆环图差异不大。但当涉及二维数据时,饼图依赖角度对比大小,而圆环图利用弧长对比更为直观。此外,在多图对比场景中,饼图完全填充容易因色系选择不当产生厚重或陈旧感。

③ 对于旭日图或双层环形等复合图形,其设计逻辑与上述优势类似。

圆环图示例:

二、数据展示

本文使用的数据为随机选取的八座城市过去一年的每日空气质量评级数据,通过爬虫从天气后报网(http://www.tianqihoubao.com/aqi/)获取。

网页原始数据如下:

由于圆环图适用于定性数据,我们将质量等级作为可视化对象。目标是利用圆环图分析各城市全年空气质量等级的分布情况。整理后的Excel数据如下:

接下来,我们导入数据。

import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
 
df_yh = pd.DataFrame(pd.read_excel('./天气质量指数.xlsx'))

绘图所需的数据结构如下:

三、图像绘制

显然,我们的数据属于二维定性数据【城市+空气质量等级】。若将质量等级作为大类绘制复合图也是可行的,但由于城市数量较多,图形会显得拥挤。因此,本文选择绘制八幅单圆环图并进行排列对比。

plt.rcParams['font.sans-serif'] = 'Microsoft YaHei'
plt.rcParams['axes.unicode_minus'] = False
 
wedgeprops = {'width':0.3, 'edgecolor':'black', 'linewidth':3}
colors = ['#ffda03', '#58bc08','#ff964f' ,'#c875c4' ,'#9a3001']
fig = plt.figure(figsize=(17,9))
for i in range(1,9):
    plt.subplot(2,4,i)
    plt.pie(df_yh.iloc[i-1,1:], wedgeprops=wedgeprops, startangle=90, colors=colors)
    plt.text(0, 0, df_yh['城市'][i-1] , ha='center', va='center', fontsize=22)
# plt.savefig(r'./绘图结果/圆环图.png')

绘制结果如下所示:

四、参数解释

(1) wedgeprops是绘图时的参数字典。

① ‘width’ -- 圆环宽度,取值范围为[0,1]。值越大圆环越宽,当width=1时绘制结果即为饼图,如下所示:

② ‘edgecolor' -- 边缘线颜色,涵盖内环、外环及各类别间的分割线。颜色需为plt库支持的颜色,建议优先选择深色。

③ ’linewidth' -- 边缘线宽度。取值范围[0,100+),可为小数值,值越大线条越粗。具体数值需根据图形效果调试,个人建议控制在10以内。

(2) startangle是第一个数据的起始绘制角度。

取值可为实数域内的任意数字,支持正负值。0代表正东方向,-90代表正南方向,90代表正北方向。需注意,图形绘制方向为逆时针。

(3) plt.text

此处用于标注标题。

plt(x,y)中的x、y用于坐标定位。

ha -- Horizontal,水平方向上以标注文本的哪个位置作为中心,可选值:'center', 'right', 'left'。

va -- vertical,竖直方向上以标注文本的哪个位置作为中心,可选值:'top', 'bottom', 'center', 'baseline', 'center_baseline'。

为便于理解,分别以ha='right'和'left'为例:

从图中可见,‘right’并非指文本整体居右,而是以文本的右侧(如“京”字)为起点在(0,0)处绘制。同理,‘left’并非指文本居左,而是以文本的左侧(如“北”字)为起点绘制。

(4) 可以绘制如示例图一样的colorbar或legend吗?

plt.legend()可显示pie中设定的labels,即在plt.pie()中增加labels=labels,但这会导致每个小类都附带类标记。若不希望图中直接标记出“优”或“轻度污染”等部分,可进行如下调整:

labels = ['优','良','轻度污染','中度污染','重度污染']
wedgeprops = {'width':0.3, 'edgecolor':'black', 'linewidth':3}
colors = ['#ffda03', '#58bc08','#ff964f' ,'#c875c4' ,'#9a3001']
fig = plt.figure(figsize=(5,5))
plt.pie(df_yh.iloc[1,1:], wedgeprops=wedgeprops, startangle=0, colors=colors)
plt.legend(labels,loc='upper left')
plt.text(0, 0, df_yh['城市'][1] , ha='center', va='center', fontsize=22)

得到的结果即为:

总结

到此这篇关于Python利用matplotlib绘制圆环图的文章就介绍到这了,更多相关Python matplotlib绘制圆环图内容请搜索本站以前的文章或继续浏览下面的相关文章希望大家以后多多支持本站!

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表