学径XUEJING · 个人学习平台通知设置

课程库 AI 主线 数据可视化 › 第 2

matplotlib 快速上手 —— 折线、柱状、饼图

普通课60 分钟

本课导读

选型的眼睛有了,今天练手。本课搞懂 matplotlib 的两句话心智模型(画布与坐标系),然后把最常用的三种图——折线、柱状、饼——各画到"能独立默写",最后接通 pandas:把 groupby 的结果直接喂给图。代码量不大,但每行都要知道自己在干什么。预计 60 分钟。

两句话心智模型:fig 与 ax

matplotlib 代码的第一行几乎总是这句,先把它读透:

import matplotlib.pyplot as plt

fig, ax = plt.subplots(figsize=(6, 3))
  • fig(figure)是画布:整张纸,管尺寸(figsize,单位英寸)、管保存
  • ax(axes)是坐标系:纸上真正画图的区域,管数据、标题、轴——画图动作基本都喊 ax
  • plt.subplots() 一次交付一套"纸 + 坐标系",解包接住(U1.1 的功夫)

提示

类比记忆:fig 是画框,ax 是框里的画纸。买画框送画纸(subplots 一起给),落笔在纸上(ax.plot / ax.set_title),装裱尺寸问画框(figsize)。以后见到"一张图里四个小图",就是一个画框裱了四张纸——同一套模型。

你可能在网上见过 plt.plot(...) 不写 fig/ax 的写法——能跑,但图一复杂就乱。本课程统一 fig, ax 起手,这也是官方推荐的正式写法。

折线图:plot

Python
  • ax.plot(x, y) 一条线;再 plot 一次就多一条线(同一张纸上叠加)
  • 多线必配 label= + ax.legend()——没有图例的多线图是猜谜
  • marker="o" 标出数据点,linestyle="--" 虚线——目标/预测线用虚线是行业默契

柱状图:bar 与 barh

Python

两个要点:

  • 竖版 bar、横版 barh——类别名一长就换横向(横向的类别名永远不用歪脖子读)
  • 注意本例数据先排好了序再画——柱状图按大小排序是基本礼貌,乱序柱状图逼读者自己找最大值

(一个代码块画两张图?没问题——每 plt.subplots() 一次就多一张纸,运行后两张都会显示出来。)

饼图:pie

Python

饼图三件套:labels 标名字、autopct 标百分比、startangle=90 从正上方开切(更符合阅读习惯)。谨记上节课的边界:类别 ≤5 才请它出场

接通 pandas:分析到图表一条龙

真实工作流不是手敲数据列表,而是 pandas 算完直接画

Python

衔接点就一处:groupby 的结果是 Series——.index 是标签(当 x 轴),.values 是数字(当 y 轴)。"清洗 → 分组 → 排序 → 画图"从此一条流水线。

说明

pandas 还有更懒的快捷键 by_city.plot(kind="bar", ax=ax)——底层还是 matplotlib。本课程先练 ax.bar 的明白写法,知其所以然;快捷键将来自然会用。

✍️ 练习

练习 1:默写折线

某自由职业者记录了六个月的接单收入:18, 22, 19, 30, 27, 35(千元)。画折线图:带数据点标记、标题《上半年接单收入》。

Python
✅ 参考答案
import matplotlib.pyplot as plt

months = ["1月", "2月", "3月", "4月", "5月", "6月"]
income = [18, 22, 19, 30, 27, 35]

fig, ax = plt.subplots(figsize=(6, 3))
ax.plot(months, income, marker="o")
ax.set_title("上半年接单收入(千元)")

练习 2:排序 + 横向柱状

五门网课的报名人数如下(乱序)。先降序排好,再画横向柱状图(课程名较长,正是 barh 的主场)。

Python
✅ 参考答案
import pandas as pd
import matplotlib.pyplot as plt

data = pd.Series(
    {"Python 数据分析入门": 340, "AI 提示词工程实战": 520,
     "Excel 到 pandas 迁移": 180, "机器学习数学基础": 95,
     "LLM 应用开发": 410}
)

ranked = data.sort_values()          # barh 从下往上画,升序排让最大值在顶部
fig, ax = plt.subplots(figsize=(6, 3))
ax.barh(ranked.index, ranked.values)
ax.set_title("各课程报名人数")

小细节:barh 自下而上画,所以升序排完,最大值恰好落在最上面——横向排行榜的惯用手法。

练习 3:一条龙(挑战)

从原始订单出发:groupby 算出各产品销售额占比 → 用饼图呈现(带百分比标注)。想想为什么这份数据适合饼图。

Python
✅ 参考答案
import pandas as pd
import matplotlib.pyplot as plt

raw = """order_id,product,amount
1001,键盘,299
1002,鼠标,178
1003,显示器,1599
1004,键盘,897
1005,鼠标,89
1006,键盘,598"""
with open("orders.csv", "w", encoding="utf-8") as f:
    f.write(raw)
df = pd.read_csv("orders.csv")

by_product = df.groupby("product")["amount"].sum()

fig, ax = plt.subplots(figsize=(4.5, 4.5))
ax.pie(by_product.values, labels=by_product.index, autopct="%1.0f%%", startangle=90)
ax.set_title("各产品销售额占比")

适合饼图的理由:只有 3 个类别、问题是"构成"——两个条件都踩在饼图的舒适区里。

📝 随堂测验

随堂测验0 / 5 题正确

1. fig, ax = plt.subplots() 里 fig 和 ax 的分工是?

2. 同一坐标系画两条线并让读者分清谁是谁,需要?

3. 类别名很长的排名数据,更好的画法是?

4. 画柱状图前先 sort_values 排序,是为了?

5. groupby 的结果(Series)怎么接到 ax.bar 上?

本课小结

  • 心智模型:fig 画框、ax 画纸fig, ax = plt.subplots(figsize=(宽, 高)) 是标准起手式
  • 三图默写:ax.plot(多线配 label+legend)、ax.bar/barh(先排序,名长换横向)、ax.pie(labels+autopct+startangle)
  • pandas 直连:groupby 结果的 .index 当 x、.values 当 y——分析到图一条龙
  • 图会自动显示在输出区,不用 plt.show()

图能画出来了,但"能看"不等于"能见人"。下一课学装裱:标题、轴标签、配色、导出——把图修到能进周报。

划选正文任意文字可高亮、批注或加入复习卡

讨论

载入中…