Python Matplotlib 绘制环形图的两种高效方案

何川
何川
发布时间:2026-10-12 | 3人浏览过
原创

本文详细介绍使用 Python 配合 Matplotlib 绘制环形图的两种核心方案。第一种利用饼图 wedgeprops 参数快速挖空成环,适合单值进度展示;第二种基于极坐标轴与水平条形图构建,支持多层嵌套与精细定制。读者可直接复制代码获取清晰的数据对比效果。

目标与原理概述

环形图(Donut Chart)在功能上等同于饼图,整体环面按不同圆弧划分表示各分类占比。其核心优势在于中心留白区域可用于叠加关键数值或备注信息,相比传统饼图能承载更丰富的数据层。在实际的 Python数据可视化 项目中,我们通常采用以下两种路径来实现该图表。

环形图与普通饼图的结构对比示意图
环形图通过中心留白展示附加信息,视觉层次更分明

第一步:配置运行环境与基础依赖

确保已安装支持中文显示的 Python 环境及 matplotlib 库。所有代码均基于标准数据科学栈编写,导入 plt 后即可调用相关 API。

第二步:方法一——基于饼图参数的快速转换

这是最简捷的环形图实现路径。Matplotlib 未提供独立的画圆环接口,但可通过 pie 函数的 wedgeprops 参数向内挖空,形成环形结构。该方法适合快速渲染单一占比数据。

未设置宽度的原始饼图效果
默认饼图无中心留白,信息密度较低

首先绘制基础饼图:

import matplotlib.pyplot as plt
plt.pie([87, 13], startangle=90, colors=['#5DADE2', '#515A5A'])
plt.show()
应用wedgeprops参数后的环形图轮廓
设置 width 参数后成功呈现环形缺口

接着添加 wedgeprops 定义环体宽度:

fig, ax = plt.subplots(figsize=(6, 6))
ax.pie(
    [87, 13], 
    wedgeprops={'width': 0.3}, 
    startangle=90, 
    colors=['#5DADE2', '#515A5A']
)
plt.show()
填充中心文本与外部标注的最终环形图
利用留白区放置核心数据,图表可读性显著提升

此时可利用中心空间增强数据表现力。如需优化边缘样式与排版:

fig, ax = plt.subplots(figsize=(6, 6))
wedgeprops = {'width': 0.3, 'edgecolor': 'black', 'linewidth': 3}
ax.pie([87, 13], wedgeprops=wedgeprops, startangle=90, colors=['#5DADE2', '#515A5A'])
plt.title('Worldwide Access to Electricity', fontsize=24, loc='left')
plt.text(0, 0, "87%", ha='center', va='center', fontsize=42)
plt.text(-1.2, -1.2, "Source: ourworldindata.org/energy-access", ha='left', va='center', fontsize=12)
plt.show()

对于强调单一比例的进度条场景,可进一步隐藏背景扇区:

fig, ax = plt.subplots(figsize=(6, 6))
data = [87, 13]
wedgeprops = {'width': 0.3, 'edgecolor': 'black', 'linewidth': 3}
patches, _ = ax.pie(data, wedgeprops=wedgeprops, startangle=90, colors=['#5DADE2', 'white'])
patches[1].set_zorder(0)
patches[1].set_edgecolor('white')
plt.title('Worldwide Access to Electricity', fontsize=24, loc='left')
plt.text(0, 0, f"{data[0]}%", ha='center', va='center', fontsize=42)
plt.text(-1.2, -1.3, "Source: ourworldindata.org/energy-access", ha='left', va='top', fontsize=12)
plt.show()

第三步:方法二——基于极坐标与条形图的深度定制

当需要多层同心圆环或非对称进度条时,改用极坐标系配合水平条形图更具灵活性。该方法需将百分比换算为弧度,并精确控制起始角度与垂直间距。

极坐标条形图初始构建效果
使用 subplot_kw 启用 polar 投影后的基础形态

初始化极坐标轴并进行基础数据映射:

from math import pi
fig, ax = plt.subplots(figsize=(6, 6), subplot_kw={'projection': 'polar'})
data = 87
startangle = 90
x = (data * pi * 2) / 100
left = (startangle * pi * 2) / 360
ax.barh(1, x, left=left, height=1, color='#5DADE2')
plt.ylim(-3, 3)
plt.show()
移除坐标轴刻度后的清爽环形图
清除刻度与网格线后视觉焦点完全集中于环形进度

清理坐标轴元素并居中显示数值:

from math import pi
fig, ax = plt.subplots(figsize=(6, 6), subplot_kw={'projection': 'polar'})
data = 87
startangle = 90
x = (data * pi * 2) / 100
left = (startangle * pi * 2) / 360
plt.xticks([])
plt.yticks([])
ax.spines.clear()
ax.barh(1, x, left=left, height=1, color='#5DADE2')
plt.ylim(-3, 3)
plt.text(0, -3, "87%", ha='center', va='center', fontsize=42)
plt.show()
多组独立环形进度条并列展示的成品图
通过 ys 数组错位排列,实现复杂多环布局

扩展至多组数据渲染,通过循环添加散点使两端呈圆润形态:

from math import pi
import numpy as np
from matplotlib.patches import Patch
from matplotlib.lines import Line2D
fig, ax = plt.subplots(figsize=(6, 6))
ax = plt.subplot(projection='polar')
data = [82, 75, 91]
startangle = 90
colors = ['#4393E5', '#43BAE5', '#7AE6EA']
xs = [(i * pi * 2) / 100 for i in data]
ys = [-0.2, 1, 2.2]
left = (startangle * pi * 2) / 360
for i, x in enumerate(xs):
    ax.barh(ys[i], x, left=left, height=1, color=colors[i])
    ax.scatter(x + left, ys[i], s=350, color=colors[i], zorder=2)
    ax.scatter(left, ys[i], s=350, color=colors[i], zorder=2)
plt.ylim(-4, 4)
legend_elements = [
    Line2D([0], [0], marker='o', color='w', label='Group A', markerfacecolor='#4393E5', markersize=10),
    Line2D([0], [0], marker='o', color='w', label='Group B', markerfacecolor='#43BAE5', markersize=10),
    Line2D([0], [0], marker='o', color='w', label='Group C', markerfacecolor='#7AE6EA', markersize=10)
]
ax.legend(handles=legend_elements, loc='center', frameon=False)
plt.xticks([])
plt.yticks([])
ax.spines.clear()
plt.show()

第四步:完成判断与排错建议

成功绘制环形图的标志是运行脚本后窗口正常弹出且中心留白区域准确显示预期内容。若图形比例异常,请核对 startangle=90 是否生效以保证数据从 12 点钟方向起始。极坐标法中若发现残留刻度,依次执行 plt.xticks([]) 与 plt.yticks([]) 可彻底清空干扰线。部分旧版本环境中 ax.spines.clear() 可能存在兼容差异,若触发 AttributeError 报错,可直接替换为 plt.axis('off') 实现全屏遮罩。

简要总结

以上就是 Python Matplotlib 环形图绘制的详细内容。通过 wedgeprops 参数可秒级生成单环进度条,而极坐标映射法则能支撑复杂的多层布局。更多关于 Python数据可视化 进阶技巧与图表优化的资料请关注本站其它相关文章!

本站声明

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

Python 相关产品和应用

全部下载

专题列表