NumPy负责高效的数据生成与处理,而Matplotlib则是Python中最流行的绘图库。将两者结合,可以快速将数值结果转化为直观的图表,是数据分析与科学计算的标准工作流。本章将介绍如何使用NumPy创建数据,并用Matplotlib绘制常见图形。
首先导入必要的库,使用NumPy生成一组等间隔的x值,并计算对应的正弦值,然后通过Matplotlib绘制线图。
import numpy as np
import matplotlib.pyplot as plt
# 生成数据
x = np.linspace(0, 2 * np.pi, 100)
y = np.sin(x)
# 绘图
plt.plot(x, y)
plt.title('正弦曲线')
plt.xlabel('x')
plt.ylabel('sin(x)')
plt.grid(True)
plt.show()
运行上述代码将显示一条正弦波曲线。
可以在一张图上绘制多条曲线,并添加图例。
x = np.linspace(0, 2 * np.pi, 100)
y1 = np.sin(x)
y2 = np.cos(x)
plt.plot(x, y1, label='sin(x)')
plt.plot(x, y2, label='cos(x)')
plt.legend()
plt.title('正弦与余弦')
plt.show()
使用scatter绘制散点图,通常用于展示两个变量的关系。
# 生成随机数据
rng = np.random.default_rng(42)
x = rng.normal(0, 1, 200)
y = rng.normal(0, 1, 200)
colors = rng.random(200)
sizes = rng.integers(20, 100, 200)
plt.scatter(x, y, c=colors, s=sizes, alpha=0.6, cmap='viridis')
plt.colorbar(label='随机值')
plt.xlabel('X')
plt.ylabel('Y')
plt.title('散点图示例')
plt.show()
直方图用于展示数据的分布情况。NumPy的random模块可以轻松生成符合特定分布的数据。
data = np.random.normal(170, 10, 1000) # 均值170,标准差10,1000个样本
plt.hist(data, bins=30, edgecolor='black', alpha=0.7)
plt.xlabel('身高 (cm)')
plt.ylabel('频数')
plt.title('身高分布直方图')
plt.show()
NumPy数组可以直接作为图像数据传递给imshow。例如,生成一个随机矩阵并显示为灰度图。
# 生成一个随机图像(8x8 像素)
image = np.random.rand(8, 8)
plt.imshow(image, cmap='gray', interpolation='nearest')
plt.colorbar()
plt.title('随机图像')
plt.show()
也可以读取外部图片(通过matplotlib.image.imread或plt.imread),返回NumPy数组,然后进行处理。
Matplotlib提供了丰富的自定义选项,如颜色、线型、标记等。
x = np.linspace(0, 10, 20)
y = x ** 2
plt.plot(x, y, color='red', linestyle='--', marker='o', markersize=8, label='二次函数')
plt.xlabel('x')
plt.ylabel('y')
plt.legend()
plt.show()
使用plt.subplots可以在一张画布上创建多个子图,方便对比。
x = np.linspace(0, 2 * np.pi, 100)
fig, axes = plt.subplots(2, 2, figsize=(10, 8))
axes[0, 0].plot(x, np.sin(x))
axes[0, 0].set_title('sin(x)')
axes[0, 1].plot(x, np.cos(x))
axes[0, 1].set_title('cos(x)')
axes[1, 0].plot(x, np.tan(x))
axes[1, 0].set_ylim(-5, 5)
axes[1, 0].set_title('tan(x)')
axes[1, 1].plot(x, np.exp(-x) * np.sin(x))
axes[1, 1].set_title('阻尼振荡')
plt.tight_layout()
plt.show()
使用savefig将图形保存为文件(如PNG、PDF、SVG等)。
x = np.linspace(0, 10, 100)
plt.plot(x, np.sin(x))
plt.title('正弦曲线')
plt.savefig('sine_wave.png', dpi=300, bbox_inches='tight')
plt.close() # 关闭当前图形,释放内存
虽然本章聚焦NumPy与Matplotlib,但实际中常与Pandas结合使用:Pandas的DataFrame.plot()方法本质是对Matplotlib的封装,可以直接调用。例如:
import pandas as pd
df = pd.DataFrame({'x': np.linspace(0, 10, 100),
'y': np.sin(np.linspace(0, 10, 100))})
df.plot(x='x', y='y')
plt.show()
但为了最大灵活性,通常还是直接使用Matplotlib操作NumPy数组。
%matplotlib inline使图形直接显示在输出中。在脚本中需要调用plt.show()才能弹出窗口。
NumPy和Matplotlib是Python科学计算生态中的基石。通过NumPy生成或处理数据,再借助Matplotlib将其可视化,能够帮助我们更直观地理解数据特征和模式。掌握这两者的结合使用,是成为数据科学家的必备技能。