結合 NumPy 和 Matplotlib 進行數據可視化的十種創意
大家好!今天我們要聊的是如何使用 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 在數據可視化中的強大能力。無論是簡單的正弦波形還是復雜的等高線圖,都能輕松實現。希望這些基礎示例能夠幫助大家更好地理解和應用這兩個庫。下一期我們繼續探索更多有趣的應用!