用 matplotlib 画出你的第一幅数据画:Python 可视化入门指南
一、为什么要学 matplotlib?
当你拿到一组数据 —— 比如一个班级的考试成绩、一周的气温变化,或者不同专业的选课人数时,密密麻麻的数字很难让人一眼看出规律。这时候,matplotlib 就像一位 “数据画家”,能把冰冷的数字变成直观的图表,让趋势、差异、分布一目了然。
作为计算机专业的新生,未来会接触大量实验数据、统计结果,学会用 matplotlib 画图,不仅能让你的作业和报告更出彩,还能帮你快速从数据中发现问题。而且它操作简单,哪怕是零基础,也能很快画出像样的图表。
二、安装 matplotlib
在开始画图前,需要先把这个工具 “请” 到电脑里。打开终端(Windows 用命令提示符,Mac/Linux 用终端),输入以下命令:
pip install matplotlib -i https://mirrors.aliyun.com/pypi/simple/
!!!!滴滴:不知道怎么安装第三方库或者想换用国内镜像源加速下载,可以点击链接跳转推荐学习文章↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
极速配置!Anaconda换用国内pip镜像源,一劳永逸解决下载龟速!
安装完成后,打开 Python 环境(比如 IDLE、VS Code 或 Jupyter Notebook),输入下面的代码验证是否安装成功:
import matplotlib.pyplot as plt # 按照惯例,简写成plt
print(plt.__version__) # 打印版本号,能输出就说明安装成功
三、matplotlib 的基本概念:画布与画笔
在正式画图前,先搞懂两个核心概念,就像画画要先准备画布和画笔:
- Figure(画布):相当于你画画用的纸,所有图表都画在这张纸上。
- Axes(子图):画布上可以画多个图表,每个图表就是一个子图,就像一张纸上可以分区域画几幅小画。
平时用得最多的是 “一张画布 + 一个子图” 的组合,用一行代码就能创建:
import matplotlib.pyplot as plt
# 创建画布和子图(1行1列的第1个图)
fig, ax = plt.subplots()
plt.show() # 显示图像
运行后会弹出一个空白窗口,这就是你的第一张 “画布” 啦。
四、画折线图:展示趋势变化
折线图最适合展示数据随时间或顺序的变化趋势,比如一周的气温变化、一个学期的成绩波动。
4.1 基础折线图
假设我们有一组数据:周一到周五的气温(单位:℃)分别是 18、20、19、22、25,用折线图展示:
import matplotlib.pyplot as plt
# 准备数据
days = ["周一", "周二", "周三", "周四", "周五"]
temperatures = [18, 20, 19, 22, 25]
# 创建画布和子图
fig, ax = plt.subplots()
# 画折线图
ax.plot(days, temperatures)
# 设置标题和坐标轴标签
ax.set_title("一周气温变化") # 标题
ax.set_xlabel("星期") # x轴标签
ax.set_ylabel("气温 (℃)") # y轴标签
# 显示图像
plt.show()
运行后会看到一条连接各点的折线,清晰展示了气温的起伏。
4.2 美化折线图
可以给折线换颜色、加标记,让图表更美观:
import matplotlib.pyplot as plt
days = ["周一", "周二", "周三", "周四", "周五"]
temperatures = [18, 20, 19, 22, 25]
fig, ax = plt.subplots()
# color设置颜色(red/blue/green等,或用十六进制#FF0000)
# marker设置点标记(o是圆圈,s是正方形,^是三角形)
# linestyle设置线样式(-是实线,--是虚线,-.是点划线)
ax.plot(days, temperatures, color="red", marker="o", linestyle="--")
ax.set_title("一周气温变化", fontsize=15) # 调整标题字体大小
ax.set_xlabel("星期", fontsize=12)
ax.set_ylabel("气温 (℃)", fontsize=12)
plt.show()
4.3 多条折线对比
如果想同时展示两个班级的成绩趋势,只需多调用一次plot函数:
import matplotlib.pyplot as plt
# 数据:第1-5周的平均成绩
weeks = [1, 2, 3, 4, 5]
class1 = [80, 82, 85, 83, 88]
class2 = [78, 76, 80, 84, 86]
fig, ax = plt.subplots()
ax.plot(weeks, class1, label="一班", color="blue", marker="s")
ax.plot(weeks, class2, label="二班", color="green", marker="^")
ax.set_title("两个班级成绩趋势对比")
ax.set_xlabel("周次")
ax.set_ylabel("平均成绩")
ax.legend() # 显示图例(根据label自动生成)
plt.show()
五、画柱状图:比较数据差异
柱状图适合比较不同类别的数据,比如不同课程的选课人数、不同专业的平均绩点。
5.1 基础柱状图
统计计算机系 4 门课程的选课人数:
import matplotlib.pyplot as plt
courses = ["Python", "C语言", "数据结构", "计算机网络"]
students = [120, 150, 90, 110]
fig, ax = plt.subplots()
# 画柱状图,color可以传列表设置每个柱子的颜色
ax.bar(courses, students, color=["red", "blue", "green", "yellow"])
ax.set_title("各课程选课人数")
ax.set_xlabel("课程名称")
ax.set_ylabel("选课人数")
plt.show()
5.2 横向柱状图
如果类别名称太长,横向柱状图更合适:
import matplotlib.pyplot as plt
courses = ["Python程序设计", "C语言程序设计", "数据结构与算法", "计算机网络原理"]
students = [120, 150, 90, 110]
fig, ax = plt.subplots()
# barh画横向柱状图(把x和y的数据反过来)
ax.barh(courses, students, color="orange")
ax.set_title("各课程选课人数")
ax.set_xlabel("选课人数")
ax.set_ylabel("课程名称")
plt.show()
5.3 分组柱状图
比较两个年级同一课程的选课人数:
import matplotlib.pyplot as plt
import numpy as np # 用numpy辅助计算柱子位置
courses = ["Python", "C语言", "数据结构"]
grade1 = [80, 100, 60]
grade2 = [70, 90, 85]
x = np.arange(len(courses)) # 生成0,1,2作为x轴位置
width = 0.35 # 柱子宽度
fig, ax = plt.subplots()
# 两组柱子错开排列
ax.bar(x - width/2, grade1, width, label="大一")
ax.bar(x + width/2, grade2, width, label="大二")
ax.set_title("不同年级选课人数对比")
ax.set_xlabel("课程名称")
ax.set_ylabel("选课人数")
ax.set_xticks(x) # 设置x轴刻度位置
ax.set_xticklabels(courses) # 用课程名替换刻度
ax.legend()
plt.show()
六、画散点图:展示变量关系
散点图用于观察两个变量之间的关系,比如学习时间与考试成绩的关系、身高与体重的关系。
假设我们调查了 10 名学生的每周学习时间(小时)和期末考试成绩:
import matplotlib.pyplot as plt
study_time = [10, 15, 8, 20, 12, 18, 5, 22, 16, 14]
scores = [65, 78, 60, 85, 70, 82, 55, 90, 79, 75]
fig, ax = plt.subplots()
# 画散点图,s设置点的大小,alpha设置透明度(0-1)
ax.scatter(study_time, scores, color="purple", s=50, alpha=0.7)
ax.set_title("学习时间与成绩关系")
ax.set_xlabel("每周学习时间(小时)")
ax.set_ylabel("期末考试成绩")
plt.show()
从图中能明显看出:学习时间越长,成绩往往越高,这就是变量间的正相关关系。
七、画饼图:展示占比情况
饼图适合展示各部分占总体的比例,比如班级中不同成绩等级的人数占比。
统计一个班级 50 名学生的成绩等级分布:
import matplotlib.pyplot as plt
grades = ["优秀", "良好", "及格", "不及格"]
counts = [10, 20, 15, 5]
fig, ax = plt.subplots()
# 画饼图,autopct显示百分比,explode突出某一块(这里突出“优秀”)
ax.pie(counts, labels=grades, autopct="%1.1f%%", explode=[0.1, 0, 0, 0])
ax.axis("equal") # 保证饼图是正圆形
ax.set_title("班级成绩等级分布")
plt.show()
autopct="%1.1f%%"表示保留 1 位小数的百分比,explode参数让 “优秀” 这一块稍微分开,更醒目。
八、实用技巧:让图表更专业
8.1 中文显示问题
有时候图表中的中文会变成乱码,只需在代码开头加几行设置:
import matplotlib.pyplot as plt
# 设置中文字体(支持Windows和Mac)
plt.rcParams["font.family"] = ["SimHei", "WenQuanYi Micro Hei", "Heiti TC"]
# 解决负号显示问题
plt.rcParams["axes.unicode_minus"] = False
8.2 保存图表
画好的图表可以保存成图片文件(png、jpg、pdf 等):
# 在plt.show()之前调用savefig
fig.savefig("成绩趋势图.png", dpi=300) # dpi设置清晰度,数值越大越清晰
plt.show()
8.3 调整画布大小
创建画布时可以指定大小(宽和高,单位英寸):
fig, ax = plt.subplots(figsize=(8, 5)) # 宽8英寸,高5英寸
九、综合案例:分析学生成绩数据
假设我们有一组包含 100 名学生的成绩数据(语文、数学、英语),用多种图表组合分析:
import matplotlib.pyplot as plt
import numpy as np
# 生成随机数据(模拟100名学生成绩)
np.random.seed(42) # 固定随机数,保证结果一致
chinese = np.random.randint(60, 100, 100)
math = np.random.randint(50, 100, 100)
english = np.random.randint(65, 95, 100)
# 创建2行2列的子图(4个图表)
fig, axes = plt.subplots(2, 2, figsize=(12, 10))
fig.suptitle("学生成绩数据分析", fontsize=16) # 总标题
# 1. 语文成绩直方图(看分布)
axes[0, 0].hist(chinese, bins=10, color="red", alpha=0.7)
axes[0, 0].set_title("语文成绩分布")
axes[0, 0].set_xlabel("分数")
axes[0, 0].set_ylabel("人数")
# 2. 三门成绩箱线图(看差异)
axes[0, 1].boxplot([chinese, math, english], labels=["语文", "数学", "英语"])
axes[0, 1].set_title("三门成绩对比")
axes[0, 1].set_ylabel("分数")
# 3. 数学与英语成绩散点图(看关系)
axes[1, 0].scatter(math, english, color="green", alpha=0.5)
axes[1, 0].set_title("数学与英语成绩关系")
axes[1, 0].set_xlabel("数学成绩")
axes[1, 0].set_ylabel("英语成绩")
# 4. 平均分饼图(看占比)
avg_scores = [np.mean(chinese), np.mean(math), np.mean(english)]
axes[1, 1].pie(avg_scores, labels=["语文", "数学", "英语"], autopct="%1.1f%%")
axes[1, 1].set_title("三门课程平均分占比")
axes[1, 1].axis("equal")
# 调整子图间距
plt.tight_layout()
plt.show()
这个案例用了直方图(分布)、箱线图(差异)、散点图(关系)、饼图(占比),从多个角度分析数据,这也是实际数据分析中常用的思路。
十、总结
matplotlib 就像一个功能强大的画笔,能把抽象的数据变成直观的图像。作为计算机专业的新生,你不需要一开始就掌握所有功能,先学会画折线图、柱状图这些基础图表,再逐步尝试更复杂的可视化。
练习的最好方式是用自己身边的数据 —— 比如记录一周的作息时间画折线图,统计班级同学的兴趣爱好画饼图。当你能通过图表清晰表达数据背后的故事时,就真正掌握了数据可视化的精髓。
更多推荐



所有评论(0)