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. 基本工作流程

  1. 生成数据:使用 NumPy 创建或处理数据(如数组、矩阵或数学函数)。
  2. 绘制图表:使用 Matplotlib 的 plt.plot()plt.scatter() 等函数绘制数据。
  3. 定制图表:设置标题、标签、颜色、图例等。
  4. 显示或保存:使用 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):绘制折线图,xy 是 NumPy 数组。
  • labelcolor 等参数用于定制图表外观。

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. 注意事项

  1. 数据准备
  • NumPy 数组是 Matplotlib 的首选输入,确保数据形状匹配(如 xy 长度一致)。
  • 使用 np.array()np.asarray() 确保数据是 NumPy 数组。
  1. 性能优化
  • 对于大数据集,尽量减少绘图点数(如使用 np.linspace 控制点数)。
  • 复杂图表可考虑其他库(如 seabornplotly)。
  1. 中文显示
  • Matplotlib 默认可能不正确显示中文,需设置字体:
    python plt.rcParams['font.sans-serif'] = ['SimHei'] # 使用黑体 plt.rcParams['axes.unicode_minus'] = False # 解决负号显示问题
  1. 交互式绘图
  • 在 Jupyter Notebook 中,使用 %matplotlib inline%matplotlib notebook 启用交互模式。
  1. 替代库
  • 对于复杂可视化,考虑 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.linspacenp.random),为 Matplotlib 提供数据。
  • Matplotlib 的作用:通过 plt.plot()plt.scatter() 等函数绘制各种图表,支持折线图、散点图、柱状图、3D 图等。
  • 结合优势:NumPy 的数组操作与 Matplotlib 的可视化结合,适合科学计算和数据分析。
  • 建议:熟悉 NumPy 的数组操作,掌握 Matplotlib 的基本绘图函数,结合实际需求选择合适的图表类型。

如果需要更具体的绘图示例(如复杂 3D 图、动态图)或 NumPy 与 Matplotlib 的其他结合方式,请告诉我!

类似文章

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注