NumPy 与 Matplotlib 使用教程
Matplotlib 是 Python 主流绘图库,可与 NumPy 无缝配合(NumPy 负责生成 / 处理数据,Matplotlib 负责可视化),提供开源的 MatLab 替代方案,还支持 PyQt、wxPython 等图形工具包。本文基于菜鸟教程内容,详细讲解其安装、基础用法、核心功能及常见图表实现。
一、Matplotlib 安装
1. 主流安装方式
不同操作系统的安装命令如下,推荐使用清华 PyPI 源(-i https://pypi.tuna.tsinghua.edu.cn/simple)提升下载速度:
| 操作系统 / 环境 | 安装命令 | 说明 |
| Windows/macOS(pip3) | pip3 install matplotlib -i https://pypi.tuna.tsinghua.edu.cn/simple | 通用 pip 安装方式,需提前安装 Python3 |
| Debian/Ubuntu(Linux) | sudo apt-get install python-matplotlib | 基于 APT 包管理器 |
| Fedora/Redhat(Linux) | sudo yum install python-matplotlib | 基于 YUM 包管理器 |
2. 安装验证
安装后通过以下命令检查是否成功(查看 Matplotlib 版本):
pip3 list | grep matplotlib
# 示例输出:matplotlib 3.3.0(版本号可能不同)
二、基础绘图:线性图实例
Matplotlib 的pyplot子模块是绘图核心,以下是最基础的线性图案例,涵盖数据生成、图表标注、显示等流程。
1. 完整代码
import numpy as np # 导入NumPy生成数据
from matplotlib import pyplot as plt # 导入绘图子模块# 1. 生成数据:x为1-10的整数,y=2x+5(线性关系)
x = np.arange(1, 11) # arange(start, end)生成[1,2,...,10]
y = 2 * x + 5# 2. 设置图表标注
plt.title("Matplotlib Demo") # 图表标题
plt.xlabel("X Axis Caption") # X轴标签
plt.ylabel("Y Axis Caption") # Y轴标签# 3. 绘制线性图并显示
plt.plot(x, y) # 绘制x与y的线性关系
plt.show() # 弹出窗口显示图表
2. 代码解释
- 数据生成:
np.arange(1,11)替代 Python 原生range,生成高效的 NumPy 数组,避免循环; - 标注设置:
title()/xlabel()/ylabel()定义图表的可读性信息,避免 “无意义图表”; - 绘图核心:
plt.plot()是基础绘图函数,默认绘制实线;plt.show()触发图表渲染,必须调用才会显示。
3. 输出结果
图表为一条从(1,7)到(10,25)的直线,X 轴范围 1-10,Y 轴范围 7-25,标注清晰。
三、关键问题:中文显示解决方案
Matplotlib 默认不支持中文字体,直接使用中文会显示 “方框”,需通过以下两种方法解决:
方法 1:使用开源思源黑体(跨平台)
思源黑体是 Adobe 与 Google 联合推出的免费中文字体,兼容性强,步骤如下:
-
下载字体:
- 官网:https://source.typekit.com/source-han-serif/cn/
- GitHub(简体中文 OTF 格式):https://github.com/adobe-fonts/source-han-sans/tree/release/OTF/SimplifiedChinese
- 网盘备用:https://pan.baidu.com/s/10-w1JbXZSnx3Tm6uGpPGOw(提取码:yxqu)
- 推荐下载
SourceHanSansSC-Bold.otf(粗体)。
-
放置字体:将下载的
SourceHanSansSC-Bold.otf文件放在代码所在目录(确保路径正确)。 -
代码实现:
import numpy as np
from matplotlib import pyplot as plt
import matplotlib.font_manager # 导入字体管理模块# 1. 加载自定义字体(fname为字体文件路径)
zh_font = matplotlib.font_manager.FontProperties(fname="SourceHanSansSC-Bold.otf")# 2. 生成数据
x = np.arange(1, 11)
y = 2 * x + 5# 3. 绘制图表(指定fontproperties参数启用中文)
plt.title("菜鸟教程 - 测试", fontproperties=zh_font, fontsize=14) # 标题+字体大小
plt.xlabel("X轴", fontproperties=zh_font)
plt.ylabel("Y轴", fontproperties=zh_font)
plt.plot(x, y)
plt.show()
方法 2:使用系统自带中文字体(无需额外下载)
先查询系统已安装的中文字体名称,再直接调用,步骤如下:
- 查询系统中文字体:
from matplotlib import pyplot as plt
import matplotlib# 打印所有已注册的字体名称
fonts = sorted([f.name for f in matplotlib.font_manager.fontManager.ttflist])
for font_name in fonts:print(font_name) # 查找包含“宋”“仿宋”“微软雅黑”等关键词的字体
- 常见系统中文字体名称:
- Windows:
STFangsong(仿宋)、Microsoft YaHei(微软雅黑); - macOS:
PingFang SC(苹方); - Linux:
WenQuanYi Zen Hei(文泉驿正黑)。
- Windows:
2.设置中文字体:
import numpy as np
from matplotlib import pyplot as plt# 全局设置中文字体(无需每次标注都传fontproperties)
plt.rcParams['font.family'] = ['STFangsong'] # 替换为查询到的字体名称
plt.rcParams['font.size'] = 12 # 可选:全局设置字体大小# 后续绘图代码与基础案例一致,中文可正常显示
x = np.arange(1, 11)
y = 2 * x + 5
plt.title("菜鸟教程 - 测试")
plt.xlabel("X轴")
plt.ylabel("Y轴")
plt.plot(x, y)
plt.show()
四、核心参数:线型、标记与颜色
plt.plot()支持通过格式字符串(如"ob")快速设置线型、标记样式和颜色,格式为[颜色][标记][线型](顺序可调整,部分参数可省略)。
1. 线型与标记样式(常用)
| 格式字符 | 描述 | 类型 |
| -- | 实线(默认) | 线型 |
| -- | 短横线 | 线型 |
| -. | 点划线 | 线型 |
| : | 虚线 | 线型 |
| . | 点标记 | 标记 |
| o | 圆标记 | 标记 |
| v | 倒三角标记 | 标记 |
| ^ | 正三角标记 | 标记 |
| s | 正方形标记 | 标记 |
| * | 星形标记 | 标记 |
| + | 加号标记 | 标记 |
| x | X 形标记 | 标记 |
2. 颜色缩写(常用)
| 格式字符 | 颜色 |
| b | 蓝色 |
| g | 绿色 |
| r | 红色 |
| c | 青色 |
| m | 品红色 |
| y | 黄色 |
| b | 黑色 |
| w | 白色 |
3. 实例:散点图(圆标记 + 蓝色)
将线性图改为散点图,只需将plt.plot(x,y)改为plt.plot(x,y,"ob")(o= 圆标记,b= 蓝色):
import numpy as np
from matplotlib import pyplot as pltx = np.arange(1, 11)
y = 2 * x + 5
plt.title("Matplotlib Demo (Scatter)")
plt.xlabel("X Axis")
plt.ylabel("Y Axis")
plt.plot(x, y, "ob") # 蓝色圆标记散点图
plt.show()
输出结果:X 轴 1-10 的位置显示蓝色圆点,无连接线,清晰展示离散数据点。
五、常见图表类型实战
1. 正弦波图(连续数据可视化)
利用 NumPy 生成正弦函数数据,Matplotlib 绘制平滑曲线:
import numpy as np
from matplotlib import pyplot as plt# 1. 生成数据:x范围0~3π,步长0.1(步长越小曲线越平滑)
x = np.arange(0, 3 * np.pi, 0.1)
y = np.sin(x) # 计算正弦值# 2. 绘图
plt.title("Sine Wave Form")
plt.xlabel("X (0~3π)")
plt.ylabel("Y (sin(x))")
plt.plot(x, y, "r-", linewidth=2) # 红色实线,线宽2
plt.show()
输出结果:振幅为[-1,1]的正弦曲线,覆盖 0 到 3π(约 9.42)的 X 范围,曲线平滑连续。
2. 子图(subplot ()):同一窗口多图表
subplot(行数, 列数, 当前子图索引)可在同一窗口划分多个子图,索引从 1 开始。以下实例同时绘制正弦和余弦曲线:
import numpy as np
from matplotlib import pyplot as plt# 1. 生成数据(正弦和余弦共用X轴)
x = np.arange(0, 3 * np.pi, 0.1)
y_sin = np.sin(x) # 正弦数据
y_cos = np.cos(x) # 余弦数据# 2. 创建子图1(2行1列,第1个图)
plt.subplot(2, 1, 1)
plt.plot(x, y_sin, "g-")
plt.title("Sine Wave") # 子图1标题# 3. 创建子图2(2行1列,第2个图)
plt.subplot(2, 1, 2)
plt.plot(x, y_cos, "b-")
plt.title("Cosine Wave") # 子图2标题# 4. 调整子图间距(避免标题与图表重叠)
plt.tight_layout()
plt.show()
输出结果:窗口分为上下两部分,上为绿色正弦曲线,下为蓝色余弦曲线,各自有标题,布局紧凑。
3. 条形图(bar ()):离散数据对比
plt.bar(x, height, color, align)用于绘制条形图,适合对比多组离散数据:
from matplotlib import pyplot as plt# 1. 两组对比数据
x1 = [5, 8, 10] # 第一组条形的X轴位置
y1 = [12, 16, 6] # 第一组条形的高度
x2 = [6, 9, 11] # 第二组条形的X轴位置
y2 = [6, 15, 7] # 第二组条形的高度# 2. 绘制两组条形图
plt.bar(x1, y1, align="center", label="Group A") # 默认颜色,添加图例标签
plt.bar(x2, y2, color="g", align="center", label="Group B") # 绿色,图例标签# 3. 设置标注与图例
plt.title("Bar Graph (Group Comparison)")
plt.xlabel("X Axis")
plt.ylabel("Y Axis (Value)")
plt.legend() # 显示图例(基于label参数)
plt.show()
输出结果:X 轴范围 5-11,两组条形居中对齐,Group A 为默认色,Group B 为绿色,图例清晰区分两组数据。
4. 直方图(histogram):数据分布可视化
直方图用于展示数据的频率分布,需先通过numpy.histogram()计算频率,再用plt.hist()绘图。
步骤 1:计算频率分布(numpy.histogram ())
import numpy as np# 1. 原始数据(15个随机整数)
a = np.array([22, 87, 5, 43, 56, 73, 55, 54, 11, 20, 51, 5, 79, 31, 27])# 2. 定义 bins(区间边界):[0,20), [20,40), [40,60), [60,80), [80,100]
bins = [0, 20, 40, 60, 80, 100]# 3. 计算频率(hist)和区间(bins)
hist, bins = np.histogram(a, bins=bins)# 4. 打印结果
print("频率分布(每个区间的数据个数):", hist) # 输出:[3 4 5 2 1]
print("区间边界:", bins) # 输出:[ 0 20 40 60 80 100]
- 解释:
[0,20)区间有 3 个数据(5,11,20),[20,40)有 4 个数据(22,31,27),以此类推。
步骤 2:绘制直方图(plt.hist ())
import numpy as np
from matplotlib import pyplot as plta = np.array([22, 87, 5, 43, 56, 73, 55, 54, 11, 20, 51, 5, 79, 31, 27])
bins = [0, 20, 40, 60, 80, 100]# 绘制直方图
plt.hist(a, bins=bins, color="orange", edgecolor="black") # 橙色柱体,黑色边框
plt.title("Histogram (Data Distribution)")
plt.xlabel("Value Range")
plt.ylabel("Frequency (Count)")
plt.show()
输出结果:X 轴为区间[0,100],Y 轴为频率(0-5),橙色柱体高度对应每个区间的数据个数,边框清晰区分柱体。
六、补充:常用全局设置
除了上述功能,可通过plt.rcParams设置全局绘图样式,避免重复代码:
import matplotlib.pyplot as plt# 1. 全局中文字体
plt.rcParams['font.family'] = ['Microsoft YaHei']
# 2. 全局字体大小
plt.rcParams['font.size'] = 12
# 3. 图表标题大小
plt.rcParams['axes.titlesize'] = 14
# 4. 轴标签大小
plt.rcParams['axes.labelsize'] = 12
# 5. 图例大小
plt.rcParams['legend.fontsize'] = 10
# 6. 线条宽度
plt.rcParams['lines.linewidth'] = 2
七、总结
Matplotlib 与 NumPy 的配合是 Python 数据可视化的基础,核心能力包括:
- 数据生成:NumPy 的
arange()、sin()、cos()等函数高效生成绘图数据; - 基础绘图:线性图、散点图、正弦波图,通过
plot()参数控制样式; - 多图表布局:
subplot()实现同一窗口多子图; - 离散 / 分布可视化:条形图(
bar())对比离散数据,直方图(hist())展示分布; - 中文支持:通过自定义字体或系统字体解决中文显示问题。
感谢大家的阅读 制作不易 麻烦各位点点关注和收藏 每天8点持续更新!!!
