NumPy Matplotlib
NumPy 和 Matplotlib 是 Python 科学计算和数据可视化的两大核心库,它们经常一起使用来处理和展示数据。NumPy 提供高效的数组操作,而 Matplotlib 则用于创建各种图表(如折线图、散点图、柱状图等)。以下是对 NumPy 与 Matplotlib 结合使用的详细中文讲解,涵盖基本概念、常见用法、示例和注意事项。
1. 概述
- NumPy:用于数值计算,提供多维数组(
ndarray
)和数学运算功能,适合生成和处理数据。 - Matplotlib:Python 的绘图库,用于创建静态、交互式和动画的可视化图表,通常通过其子模块
matplotlib.pyplot
使用。 - 结合使用:NumPy 负责生成或处理数据,Matplotlib 将数据可视化为图表。
安装:
确保已安装 NumPy 和 Matplotlib:
pip install numpy matplotlib
导入惯例:
import numpy as np
import matplotlib.pyplot as plt
2. 基本工作流程
- 生成数据:使用 NumPy 创建或处理数据(如数组、矩阵或数学函数)。
- 绘制图表:使用 Matplotlib 的
plt.plot()
、plt.scatter()
等函数绘制数据。 - 定制图表:设置标题、标签、颜色、图例等。
- 显示或保存:使用
plt.show()
显示图表,或plt.savefig()
保存为文件。
3. 常见可视化类型及示例
以下是通过 NumPy 生成数据并用 Matplotlib 绘制的常见图表类型。
3.1 折线图
折线图适合展示连续数据的趋势。
示例:绘制正弦函数曲线
import numpy as np
import matplotlib.pyplot as plt
# 使用 NumPy 生成 x 和 y 数据
x = np.linspace(0, 2 * np.pi, 100) # 从 0 到 2π,生成 100 个点
y = np.sin(x)
# 绘制折线图
plt.plot(x, y, label='sin(x)', color='blue', linewidth=2)
plt.title('正弦函数')
plt.xlabel('x')
plt.ylabel('sin(x)')
plt.legend() # 显示图例
plt.grid(True) # 显示网格
plt.show()
说明:
np.linspace(start, stop, num)
:生成等间隔的点。plt.plot(x, y)
:绘制折线图,x
和y
是 NumPy 数组。label
、color
等参数用于定制图表外观。
3.2 散点图
散点图适合展示数据的分布或关系。
示例:绘制随机散点图
# 生成随机数据
np.random.seed(42) # 固定随机种子
x = np.random.rand(50)
y = np.random.rand(50)
# 绘制散点图
plt.scatter(x, y, color='red', s=50, alpha=0.6, label='随机点')
plt.title('随机散点图')
plt.xlabel('x')
plt.ylabel('y')
plt.legend()
plt.show()
说明:
np.random.rand(n)
:生成[0, 1)
范围内的随机数。plt.scatter(x, y)
:绘制散点图,s
控制点大小,alpha
控制透明度。
3.3 柱状图
柱状图用于比较不同类别的数据。
示例:绘制成绩分布
# 生成数据
categories = ['A', 'B', 'C', 'D']
values = np.array([4, 3, 2, 1])
# 绘制柱状图
plt.bar(categories, values, color='green', alpha=0.7)
plt.title('成绩分布')
plt.xlabel('类别')
plt.ylabel('数量')
plt.show()
说明:
values
是 NumPy 数组,存储柱状图的高度。plt.bar()
绘制柱状图,alpha
控制透明度。
3.4 直方图
直方图用于展示数据的分布情况。
示例:绘制正态分布数据的直方图
# 生成正态分布随机数据
data = np.random.randn(1000)
# 绘制直方图
plt.hist(data, bins=30, color='purple', alpha=0.7, density=True)
plt.title('正态分布直方图')
plt.xlabel('值')
plt.ylabel('频率')
plt.show()
说明:
np.random.randn(n)
:生成标准正态分布随机数。plt.hist(data, bins)
:绘制直方图,bins
控制分组数量,density=True
归一化为概率密度。
3.5 等高线图/热图
等高线图和热图适合展示二维数据。
示例:绘制二维函数的等高线图
# 生成网格数据
x = np.linspace(-5, 5, 100)
y = np.linspace(-5, 5, 100)
X, Y = np.meshgrid(x, y) # 创建网格
Z = np.sin(np.sqrt(X**2 + Y**2))
# 绘制等高线图
plt.contourf(X, Y, Z, cmap='viridis')
plt.colorbar() # 添加颜色条
plt.title('二维函数等高线图')
plt.xlabel('x')
plt.ylabel('y')
plt.show()
说明:
np.meshgrid(x, y)
:生成二维网格点,适合绘制二维函数。plt.contourf()
:绘制填充的等高线图,cmap
指定颜色映射。
4. 高级功能
4.1 子图(Subplots)
使用 plt.subplots()
创建多个子图,适合展示多组数据。
示例:
# 创建 2x2 子图
fig, axs = plt.subplots(2, 2, figsize=(10, 8))
# 数据
x = np.linspace(0, 2 * np.pi, 100)
y1 = np.sin(x)
y2 = np.cos(x)
y3 = np.tan(x)
y4 = np.exp(-x)
# 绘制子图
axs[0, 0].plot(x, y1, 'b-')
axs[0, 0].set_title('sin(x)')
axs[0, 1].plot(x, y2, 'r-')
axs[0, 1].set_title('cos(x)')
axs[1, 0].plot(x, y3, 'g-')
axs[1, 0].set_title('tan(x)')
axs[1, 1].plot(x, y4, 'm-')
axs[1, 1].set_title('exp(-x)')
plt.tight_layout() # 自动调整子图间距
plt.show()
4.2 3D 图
Matplotlib 支持 3D 绘图,需要使用 mpl_toolkits.mplot3d
。
示例:绘制 3D 曲面
from mpl_toolkits.mplot3d import Axes3D
# 生成数据
x = np.linspace(-5, 5, 100)
y = np.linspace(-5, 5, 100)
X, Y = np.meshgrid(x, y)
Z = np.sin(np.sqrt(X**2 + Y**2))
# 绘制 3D 曲面
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.plot_surface(X, Y, Z, cmap='viridis')
ax.set_title('3D 曲面图')
ax.set_xlabel('x')
ax.set_ylabel('y')
ax.set_zlabel('z')
plt.show()
5. 保存图表
使用 plt.savefig()
将图表保存为文件(如 PNG、PDF、JPG)。
示例:
x = np.linspace(0, 2 * np.pi, 100)
y = np.sin(x)
plt.plot(x, y)
plt.title('正弦函数')
plt.savefig('sin_plot.png', dpi=300, bbox_inches='tight')
plt.show()
参数:
dpi
:分辨率(每英寸像素数)。bbox_inches='tight'
:自动裁剪空白边距。
6. 注意事项
- 数据准备:
- NumPy 数组是 Matplotlib 的首选输入,确保数据形状匹配(如
x
和y
长度一致)。 - 使用
np.array()
或np.asarray()
确保数据是 NumPy 数组。
- 性能优化:
- 对于大数据集,尽量减少绘图点数(如使用
np.linspace
控制点数)。 - 复杂图表可考虑其他库(如
seaborn
或plotly
)。
- 中文显示:
- Matplotlib 默认可能不正确显示中文,需设置字体:
python plt.rcParams['font.sans-serif'] = ['SimHei'] # 使用黑体 plt.rcParams['axes.unicode_minus'] = False # 解决负号显示问题
- 交互式绘图:
- 在 Jupyter Notebook 中,使用
%matplotlib inline
或%matplotlib notebook
启用交互模式。
- 替代库:
- 对于复杂可视化,考虑
seaborn
(基于 Matplotlib,样式更美观)或plotly
(交互式图表)。
7. 综合示例
生成随机数据并绘制多类型图表:
import numpy as np
import matplotlib.pyplot as plt
# 生成数据
np.random.seed(42)
x = np.linspace(0, 10, 100)
y1 = np.sin(x)
y2 = np.random.randn(100)
# 创建子图
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(12, 5))
# 折线图
ax1.plot(x, y1, 'b-', label='sin(x)')
ax1.set_title('正弦函数')
ax1.set_xlabel('x')
ax1.set_ylabel('y')
ax1.legend()
ax1.grid(True)
# 散点图
ax2.scatter(x, y2, color='red', label='随机数据')
ax2.set_title('随机散点')
ax2.set_xlabel('x')
ax2.set_ylabel('y')
ax2.legend()
plt.tight_layout()
plt.savefig('combined_plot.png', dpi=300)
plt.show()
8. 总结
- NumPy 的作用:提供高效的数据生成和处理功能(如
np.linspace
、np.random
),为 Matplotlib 提供数据。 - Matplotlib 的作用:通过
plt.plot()
、plt.scatter()
等函数绘制各种图表,支持折线图、散点图、柱状图、3D 图等。 - 结合优势:NumPy 的数组操作与 Matplotlib 的可视化结合,适合科学计算和数据分析。
- 建议:熟悉 NumPy 的数组操作,掌握 Matplotlib 的基本绘图函数,结合实际需求选择合适的图表类型。
如果需要更具体的绘图示例(如复杂 3D 图、动态图)或 NumPy 与 Matplotlib 的其他结合方式,请告诉我!