引言:為何可視化至關重要?
俗話說,“一圖勝千言”。在數據分析領域,這句話尤其正確。原始的數據表格和統計摘要雖然精確,但往往難以揭示數據中隱藏的模式、趨勢、異常值和關系。數據可視化通過將數據轉換成圖形,利用人類視覺系統的強大能力來快速識別這些信息,是**探索性數據分析(EDA)**中不可或缺的一環。
Matplotlib 是 Python 中最基礎、最強大的數據可視化庫。它為創建各種靜態、動態和交互式圖表提供了堅實的基礎。幾乎所有其他高級可視化庫(如 Seaborn)都是在 Matplotlib 的基礎上構建的。因此,掌握 Matplotlib 是進行任何嚴肅數據可視化的前提。
Matplotlib 的解剖學:Figure 與 Axes
要真正掌握 Matplotlib,首先需要理解其核心的兩個對象:Figure
和 Axes
。
- Figure: 可以看作是整個圖表的“畫布”或“畫框”。它是一個頂層容器,可以包含一個或多個圖表(
Axes
)、標題、圖例等所有繪圖元素。- Axes: 這是實際的“繪圖區域”或“子圖”。我們平時所說的“一個圖”,在 Matplotlib 的語境下通常指的就是一個
Axes
對象。它包含了數據點、x 軸(xaxis
)、y 軸(yaxis
)、刻度、標簽等。一個Figure
對象可以包含一個或多個Axes
對象。
把它們想象成一幅畫:Figure
是整個畫框,而每個 Axes
是畫框里的一幅獨立的畫。
兩種繪圖方式:Pyplot vs. 面向對象 (OO)
Matplotlib 提供了兩種主要的繪圖接口:
- Pyplot 接口 (狀態機接口): 這是一系列函數的集合(如
plt.plot()
,plt.title()
),它會自動管理當前的Figure
和Axes
。這種方式對于快速、簡單的繪圖非常方便,其風格類似于 MATLAB。 - 面向對象 (OO) 接口: 這是更強大、更靈活的方式。我們首先顯式地創建一個
Figure
對象和一個或多個Axes
對象(通常使用fig, ax = plt.subplots()
),然后調用這些對象的方法來繪圖和進行定制(如ax.plot()
,ax.set_title()
)。
為什么我們強烈推薦面向對象 (OO) 的方式?
對于初學者來說,
pyplot
接口似乎更簡單。然而,一旦你需要繪制更復雜的圖表,比如在一個Figure
中放置多個子圖,或者對某個特定的子圖進行精細控制時,pyplot
的狀態機機制就會變得混亂和難以管理。你很難確定當前的plt
函數到底作用于哪個子圖。而面向對象的方式則從根本上解決了這個問題。通過
fig, ax = plt.subplots()
,你得到了對Figure
和Axes
對象的直接引用。當你調用ax.set_title()
時,你非常清楚地知道這個標題是屬于ax
這個特定的子圖的。這種明確的控制使得代碼更具可讀性、可維護性,并且是創建復雜、可復用圖表的標準做法。從一開始就學習和使用 OO 風格,會為你未來的學習之路打下更堅實的基礎。
你的第一張圖 (使用 OO 風格)
讓我們遵循標準的 OO 風格工作流,創建幾種最常見的圖表。
標準工作流:
- 導入庫:
import matplotlib.pyplot as plt
和import numpy as np
。 - 準備數據。
- 創建 Figure 和 Axes:
fig, ax = plt.subplots()
。 - 在 Axes 上繪圖:
ax.plot()
,ax.scatter()
等。 - 定制圖表:
ax.set_title()
,ax.set_xlabel()
,ax.set_ylabel()
,ax.legend()
。 - 顯示圖表:
plt.show()
。
折線圖 (Line Plot)
折線圖非常適合展示數據隨時間或某個連續變量變化的趨勢。
import matplotlib.pyplot as plt
import numpy as npx = np.linspace(0, 10, 100)
y = np.sin(x)# 1. 創建 Figure 和 Axes
fig, ax = plt.subplots()# 2. 在 Axes 上繪圖
ax.plot(x, y)# 3. 定制圖表
ax.set_title('Simple Sine Wave')
ax.set_xlabel('X-axis')
ax.set_ylabel('Y-axis (sin(x))')# 4. 顯示圖表
plt.show()
柱狀圖 (Bar Chart)
柱狀圖用于比較不同類別之間的數量。
import matplotlib.pyplot as pltcategories = ['A', 'B', 'C', 'D']
values = [23, 45, 55, 19]fig, ax = plt.subplots()
ax.bar(categories, values, color='skyblue')ax.set_title('Category Comparison')
ax.set_xlabel('Category')
ax.set_ylabel('Value')plt.show()
散點圖 (Scatter Plot)
散點圖用于可視化兩個數值變量之間的關系,幫助我們發現相關性。
import matplotlib.pyplot as plt
import numpy as np# 生成隨機數據
x = np.random.rand(50)
y = np.random.rand(50)
colors = np.random.rand(50)
sizes = 1000 * np.random.rand(50)fig, ax = plt.subplots()
# 使用 c 參數映射顏色,s 參數映射大小,cmap 指定顏色圖譜
ax.scatter(x, y, c=colors, s=sizes, alpha=0.5, cmap='viridis')ax.set_title('Scatter Plot Example')
ax.set_xlabel('X Value')
ax.set_ylabel('Y Value')plt.show()
直方圖 (Histogram)
直方圖用于展示單個數值變量的分布情況。
import matplotlib.pyplot as plt
import numpy as np# 生成符合正態分布的隨機數據
data = np.random.randn(1000)fig, ax = plt.subplots()
ax.hist(data, bins=30, edgecolor='black')ax.set_title('Distribution of Data')
ax.set_xlabel('Value')
ax.set_ylabel('Frequency')plt.show()
總結與展望
在本篇中,我們學習了 Matplotlib 的基本概念,特別是 Figure
和 Axes
的區別,并強烈推薦了面向對象的繪圖風格。我們還實踐了如何使用 OO 風格創建四種最基本的圖表:折線圖、柱狀圖、散點圖和直方圖。
雖然 Matplotlib 功能強大且靈活,但有時繪制美觀的統計圖表需要編寫較多的樣板代碼。為了解決這個問題,社區開發了 Seaborn。在下一篇文章中,我們將學習 Seaborn 如何在 Matplotlib 的基礎上,用更簡潔的代碼創建出更具美感和信息量的統計圖形。