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
ax.plot(x, y)一条线;再 plot 一次就多一条线(同一张纸上叠加)- 多线必配
label=+ax.legend()——没有图例的多线图是猜谜 marker="o"标出数据点,linestyle="--"虚线——目标/预测线用虚线是行业默契
柱状图:bar 与 barh
两个要点:
- 竖版
bar、横版barh——类别名一长就换横向(横向的类别名永远不用歪脖子读) - 注意本例数据先排好了序再画——柱状图按大小排序是基本礼貌,乱序柱状图逼读者自己找最大值
(一个代码块画两张图?没问题——每 plt.subplots() 一次就多一张纸,运行后两张都会显示出来。)
饼图:pie
饼图三件套:labels 标名字、autopct 标百分比、startangle=90 从正上方开切(更符合阅读习惯)。谨记上节课的边界:类别 ≤5 才请它出场。
接通 pandas:分析到图表一条龙
真实工作流不是手敲数据列表,而是 pandas 算完直接画:
衔接点就一处:groupby 的结果是 Series——.index 是标签(当 x 轴),.values 是数字(当 y 轴)。"清洗 → 分组 → 排序 → 画图"从此一条流水线。
说明
pandas 还有更懒的快捷键 by_city.plot(kind="bar", ax=ax)——底层还是 matplotlib。本课程先练 ax.bar 的明白写法,知其所以然;快捷键将来自然会用。
✍️ 练习
练习 1:默写折线
某自由职业者记录了六个月的接单收入:18, 22, 19, 30, 27, 35(千元)。画折线图:带数据点标记、标题《上半年接单收入》。
✅ 参考答案
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 的主场)。
✅ 参考答案
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 算出各产品销售额占比 → 用饼图呈现(带百分比标注)。想想为什么这份数据适合饼图。
✅ 参考答案
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 个类别、问题是"构成"——两个条件都踩在饼图的舒适区里。
📝 随堂测验
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()
图能画出来了,但"能看"不等于"能见人"。下一课学装裱:标题、轴标签、配色、导出——把图修到能进周报。
划选正文任意文字可高亮、批注或加入复习卡
讨论
载入中…