Matplotlib 饼图(超详细)

什么是 Matplotlib 饼图?

在数据可视化的世界里,饼图就像一张“食物分配图”。想象你和朋友一起吃披萨,每个人分到的份额不同,你想直观展示谁吃了最多、谁最少,这时候饼图就派上用场了。它通过圆形的“切片”大小来反映各个部分占整体的比例,非常适合展示分类数据的占比关系。

Matplotlib 饼图是 Python 中最常用的数据可视化工具之一。它基于 Matplotlib 库,能够轻松绘制出美观、清晰的饼状图表。无论你是做销售分析、用户分布统计,还是课堂作业汇报,掌握 Matplotlib 饼图都能让你的数据“说话”。

这并不是一种高深莫测的技术,而是一个简单却强大的工具。只要你懂一点 Python 基础,就能快速上手。接下来,我们就一步步带你从零开始,真正理解并熟练使用 Matplotlib 饼图。

创建基础饼图

要绘制一个基础饼图,核心只需要两样东西:数据(每一块的数值)和标签(每一块的名字)。我们从最简单的例子开始。

import matplotlib.pyplot as plt

sales = [25, 30, 15, 30]  # 销售额(单位:万元)

categories = ['电子产品', '服装', '食品', '家居']

plt.figure(figsize=(8, 6))  # 设置图形大小为 8x6 英寸
plt.pie(sales, labels=categories, autopct='%1.1f%%')  # autopct 显示百分比

plt.title('各品类销售额占比')  # 添加标题
plt.show()

这段代码中:

  • plt.figure(figsize=(8, 6)):创建一个图形窗口,设定宽度为 8 英寸,高度为 6 英寸,避免图形太小看不清。
  • plt.pie():核心函数,用于绘制饼图。传入 sales 作为数值,categories 作为标签。
  • autopct='%1.1f%%':自动在每一块上显示百分比,保留一位小数。比如 25% 会显示为 25.0%。
  • plt.title():为图表添加标题,让读者一眼知道内容。
  • plt.show():真正把图表渲染出来。

运行后,你会看到一个完整的饼图,每个扇区大小对应其数值占比。这个基础结构是所有复杂饼图的起点。

美化饼图:颜色与样式调整

一个漂亮的饼图,不仅要有数据,还要有视觉吸引力。颜色、阴影、文字样式,都是提升专业感的关键。

import matplotlib.pyplot as plt

sales = [25, 30, 15, 30]
categories = ['电子产品', '服装', '食品', '家居']

colors = ['#FF6B6B', '#4ECDC4', '#45B7D1', '#96CEB4']

plt.figure(figsize=(8, 6))
plt.pie(
    sales,
    labels=categories,
    autopct='%1.1f%%',
    startangle=90,           # 从顶部开始绘制(逆时针旋转90度)
    colors=colors,           # 使用自定义颜色
    explode=(0.05, 0, 0, 0), # 突出显示第一个扇区(轻微分离)
    shadow=True,             # 添加阴影效果
    textprops={'fontsize': 12}  # 设置标签字体大小
)

plt.title('各品类销售额占比(美化版)', fontsize=14, fontweight='bold')
plt.axis('equal')  # 保持饼图为圆形,防止拉伸变形
plt.show()

关键参数说明:

  • colors=colors:使用预设的颜色列表,让图表更具设计感。
  • startangle=90:让饼图从顶部开始绘制,而不是默认从右边开始。这更符合人们的阅读习惯。
  • explode=(0.05, 0, 0, 0):让第一个扇区“突出”一点,视觉上更强调它。数值越大,分离越明显,单位是图形半径的倍数。
  • shadow=True:为饼图添加轻微阴影,增强立体感。
  • textprops={'fontsize': 12}:控制标签文字的大小。
  • plt.axis('equal'):确保饼图是正圆,避免因坐标轴比例失调导致变形。

这种美化方式,能让你的报告或展示更具说服力,尤其是在做 PPT 汇报时,视觉冲击力更强。

饼图中的百分比与数值显示

有时,仅显示百分比还不够。比如你希望在图上同时看到具体数值和百分比,便于精确分析。

import matplotlib.pyplot as plt

sales = [25, 30, 15, 30]
categories = ['电子产品', '服装', '食品', '家居']

def make_autopct(values):
    def my_autopct(pct):
        total = sum(values)
        val = int(round(pct * total / 100.0))
        return f'{pct:.1f}%\n({val}万元)'
    return my_autopct

plt.figure(figsize=(8, 6))
plt.pie(
    sales,
    labels=categories,
    autopct=make_autopct(sales),  # 使用自定义函数生成标签
    startangle=90,
    colors=['#FF6B6B', '#4ECDC4', '#45B7D1', '#96CEB4'],
    explode=(0.05, 0, 0, 0),
    shadow=True
)

plt.title('各品类销售额占比(含数值)', fontsize=14)
plt.axis('equal')
plt.show()

这里的关键是 make_autopct 函数。它接收原始数据,返回一个内部函数 my_autopct,该函数能根据当前扇区的百分比,计算出对应的原始数值,并将其显示在标签中。

比如,25% 的扇区会显示为:

25.0%
(25万元)

这种形式非常适合用于财务分析、市场调研等需要精确数据支持的场景。

处理大量分类数据的技巧

当分类数量太多时,饼图会变得杂乱。比如有 10 个以上类别,每个扇区太小,标签重叠,根本看不清。

这时,可以采用“其他”归类策略。把小部分合并为“其他”,只保留前几个大类别,保持图表清晰。

import matplotlib.pyplot as plt

products = [
    'iPhone', 'Samsung Galaxy', 'iPad', 'MacBook',
    'AirPods', 'Watch', 'Pixel', 'Surface', 'Kindle', 'Echo',
    'Smart TV', 'Headphones'
]

sales = [150, 130, 90, 80, 75, 65, 55, 50, 40, 35, 30, 25]

top_5 = sales[:5]
other_sum = sum(sales[5:])

labels = products[:5] + ['其他']

data = top_5 + [other_sum]

plt.figure(figsize=(8, 6))
plt.pie(
    data,
    labels=labels,
    autopct='%1.1f%%',
    startangle=90,
    colors=['#FF6B6B', '#4ECDC4', '#45B7D1', '#96CEB4', '#FFA500', '#8B7355']
)

plt.title('各产品线销售额占比(前5名+其他)', fontsize=14)
plt.axis('equal')
plt.show()

这种方法既保留了重点信息,又避免了图表过载。在实际工作中,这种“聚焦重点”的做法非常实用。

高级技巧:添加图例与自定义布局

有时候,饼图需要更复杂的布局,比如添加图例、调整扇区顺序、或使用不同字体。

import matplotlib.pyplot as plt

sales = [25, 30, 15, 30]
categories = ['电子产品', '服装', '食品', '家居']

plt.rcParams['font.sans-serif'] = ['SimHei', 'Arial Unicode MS', 'DejaVu Sans']
plt.rcParams['axes.unicode_minus'] = False  # 正常显示负号

fig, ax = plt.subplots(figsize=(8, 6))

wedges, texts, autotexts = ax.pie(
    sales,
    labels=categories,
    autopct='%1.1f%%',
    startangle=90,
    colors=['#FF6B6B', '#4ECDC4', '#45B7D1', '#96CEB4'],
    explode=(0.05, 0, 0, 0),
    shadow=True,
    textprops={'fontsize': 12}
)

ax.legend(wedges, categories, title="品类", loc="center left", bbox_to_anchor=(1, 0, 0.5, 1))

ax.set_title('各品类销售额占比(带图例)', fontsize=14, fontweight='bold')

ax.axis('equal')

plt.tight_layout()

plt.show()

这里的关键是:

  • fig, ax = plt.subplots():使用面向对象的方式绘图,更灵活。
  • wedges, texts, autotexts = ax.pie():获取饼图元素,方便后续操作。
  • ax.legend():添加图例,将扇区与标签对应起来。
  • bbox_to_anchor:控制图例位置,放在图表右侧。
  • plt.tight_layout():自动调整布局,防止元素重叠。

这种写法适合集成到脚本或报告中,可维护性强。

总结与建议

Matplotlib 饼图是数据可视化中不可或缺的一环。它直观、简洁,特别适合展示“部分占整体”的比例关系。从基础绘制到高级美化,我们一步步走来,涵盖了颜色、标签、图例、数据合并等实用技巧。

但也要注意:饼图并非万能。当类别过多、数值接近时,它容易失去可读性。此时可考虑改用条形图或堆叠图。在实际项目中,选择合适的图表类型,比“炫技”更重要。

掌握 Matplotlib 饼图,不仅是学会一个函数,更是培养“用图形表达数据”的思维。当你能用一张图讲清一个故事,你的编程价值就真正体现了。

现在,不妨打开你的 Python 环境,动手试试吧。一个简单的饼图,可能就是你下一次汇报的亮点。