大家好!今天我们要聊的是如何使用 NumPy 和 Matplotlib 来进行数据可视化。这两个库是 Python 中处理数值数据和绘图的强大工具。NumPy 让我们可以高效地处理数组数据,而 Matplotlib 则提供了丰富的图表绘制功能。
1. 基础数据类型可视化
首先,让我们从最基础的数据类型开始。NumPy 可以创建各种类型的数组。Matplotlib 可以将这些数组转化为直观的图表。
import numpy as np
import matplotlib.pyplot as plt
# 创建一个简单的数组
x = np.linspace(0, 10, 100)
y = np.sin(x)
# 使用 Matplotlib 绘制图形
plt.plot(x, y)
plt.title('Sine Wave')
plt.xlabel('Time')
plt.ylabel('Amplitude')
plt.show()
这段代码生成了一个简单的正弦波形图。np.linspace 函数用于生成等差数列,np.sin 用于计算正弦值。plt.plot 函数绘制曲线,plt.title, plt.xlabel, plt.ylabel 设置图表标题和轴标签。
2. 多重数据系列可视化
接下来,让我们尝试同时绘制多个数据系列。这在比较不同数据集时非常有用。
# 创建两个不同的数据系列
x = np.linspace(0, 10, 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.show()
这里,我们增加了 plt.legend() 函数,它会根据 label 参数自动添加图例。这样就可以区分不同的数据系列了。
3. 散点图可视化
散点图非常适合显示离散数据之间的关系。例如,我们可以用它来表示两个变量之间的相关性。
# 创建随机数据
x = np.random.randn(100)
y = np.random.randn(100)
# 绘制散点图
plt.scatter(x, y)
plt.title('Scatter Plot')
plt.xlabel('X-axis')
plt.ylabel('Y-axis')
plt.show()
np.random.randn 生成标准正态分布的随机数。plt.scatter 用于绘制散点图。
4. 直方图可视化
直方图可以用来展示数据的分布情况。这对于分析数据频率非常有帮助。
# 创建随机数据
data = np.random.randn(1000)
# 绘制直方图
plt.hist(data, bins=30, alpha=0.7)
plt.title('Histogram')
plt.xlabel('Value')
plt.ylabel('Frequency')
plt.show()
plt.hist 用于绘制直方图,bins 参数指定直方图的柱子数量,alpha 参数设置透明度。
5. 等高线图可视化
等高线图适用于展示二维函数的等值线。这在地理信息系统中很常见。
# 创建网格数据
x = np.linspace(-5, 5, 100)
y = np.linspace(-5, 5, 100)
X, Y = np.meshgrid(x, y)
Z = np.sqrt(X**2 + Y**2)
# 绘制等高线图
plt.contourf(X, Y, Z, 20, cmap='viridis')
plt.colorbar()
plt.title('Contour Plot')
plt.xlabel('X-axis')
plt.ylabel('Y-axis')
plt.show()
np.meshgrid 用于创建网格数据,plt.contourf 绘制等高线图,cmap 参数设置颜色映射。
6. 热力图可视化
热力图常用于展示二维数据矩阵,非常适合展示数据的相关性或密度。
# 创建一个随机的二维数据矩阵
data = np.random.rand(10, 10)
# 绘制热力图
plt.imshow(data, cmap='hot', interpolation='nearest')
plt.colorbar()
plt.title('Heatmap')
plt.xlabel('X-axis')
plt.ylabel('Y-axis')
plt.show()
plt.imshow 用于绘制热力图,cmap 参数设置颜色映射,interpolation 参数设置插值方法。
7. 饼图可视化
饼图用于展示各个部分占总体的比例,非常适合展示分类数据。
# 创建分类数据
labels = ['A', 'B', 'C', 'D']
sizes = [15, 30, 45, 10]
# 绘制饼图
plt.pie(sizes, labels=labels, autopct='%1.1f%%', startangle=140)
plt.title('Pie Chart')
plt.show()
plt.pie 用于绘制饼图,autopct 参数用于显示百分比,startangle 参数设置起始角度。
8. 箱线图可视化
箱线图用于展示数据的分布情况,特别是四分位数和异常值。
# 创建随机数据
data = np.random.randn(100)
# 绘制箱线图
plt.boxplot(data)
plt.title('Box Plot')
plt.ylabel('Value')
plt.show()
plt.boxplot 用于绘制箱线图,它可以清晰地展示数据的中位数、四分位数和异常值。
9. 三维可视化
Matplotlib 还支持三维可视化,这对于展示多维数据非常有用。
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))
# 创建三维图形
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.plot_surface(X, Y, Z, cmap='viridis')
ax.set_title('3D Surface Plot')
ax.set_xlabel('X-axis')
ax.set_ylabel('Y-axis')
ax.set_zlabel('Z-axis')
plt.show()
mpl_toolkits.mplot3d 模块提供了三维绘图功能,plot_surface 用于绘制三维表面图。
10. 动态可视化
动态可视化可以展示数据随时间的变化,非常适合展示时间序列数据。
import matplotlib.animation as animation
# 创建数据
x = np.linspace(0, 10, 100)
y = np.sin(x)
# 创建图形对象
fig, ax = plt.subplots()
line, = ax.plot(x, y)
# 更新函数
def update(frame):
line.set_ydata(np.sin(x + frame / 10.0))
return line,
# 创建动画
ani = animation.FuncAnimation(fig, update, frames=100, interval=50)
plt.title('Dynamic Sine Wave')
plt.xlabel('Time')
plt.ylabel('Amplitude')
plt.show()
matplotlib.animation 模块提供了动画功能,FuncAnimation 用于创建动画,update 函数定义每一帧的更新逻辑。
实战案例:股票价格走势分析
假设我们有一个包含某股票每日收盘价的数据集,我们想要分析其价格走势并预测未来趋势。
import pandas as pd
import yfinance as yf
# 下载股票数据
ticker = 'AAPL'
data = yf.download(ticker, start='2022-01-01', end='2023-01-01')
# 绘制股票价格走势图
plt.figure(figsize=(12, 6))
plt.plot(data['Close'], label='Close Price')
plt.title(f'{ticker} Stock Price')
plt.xlabel('Date')
plt.ylabel('Price (USD)')
plt.legend()
plt.show()
# 计算移动平均线
data['MA50'] = data['Close'].rolling(window=50).mean()
data['MA200'] = data['Close'].rolling(window=200).mean()
# 绘制移动平均线
plt.figure(figsize=(12, 6))
plt.plot(data['Close'], label='Close Price')
plt.plot(data['MA50'], label='50-Day MA')
plt.plot(data['MA200'], label='200-Day MA')
plt.title(f'{ticker} Stock Price with Moving Averages')
plt.xlabel('Date')
plt.ylabel('Price (USD)')
plt.legend()
plt.show()
在这个案例中,我们使用 yfinance 库下载了苹果公司(AAPL)的股票数据,并绘制了收盘价走势图。接着,我们计算了 50 日和 200 日的移动平均线,并将其与收盘价一起绘制,以便观察价格趋势。
通过上述示例,我们已经看到了 NumPy 和 Matplotlib 在数据可视化中的强大能力。无论是简单的正弦波形还是复杂的等高线图,都能轻松实现。希望这些基础示例能够帮助大家更好地理解和应用这两个库。下一期我们继续探索更多有趣的应用!