Langchain系列文章目錄
01-玩轉LangChain:從模型調用到Prompt模板與輸出解析的完整指南
02-玩轉 LangChain Memory 模塊:四種記憶類型詳解及應用場景全覆蓋
03-全面掌握 LangChain:從核心鏈條構建到動態任務分配的實戰指南
04-玩轉 LangChain:從文檔加載到高效問答系統構建的全程實戰
05-玩轉 LangChain:深度評估問答系統的三種高效方法(示例生成、手動評估與LLM輔助評估)
06-從 0 到 1 掌握 LangChain Agents:自定義工具 + LLM 打造智能工作流!
07-【深度解析】從GPT-1到GPT-4:ChatGPT背后的核心原理全揭秘
08-【萬字長文】MCP深度解析:打通AI與世界的“USB-C”,模型上下文協議原理、實踐與未來
Python系列文章目錄
PyTorch系列文章目錄
機器學習系列文章目錄
深度學習系列文章目錄
Java系列文章目錄
JavaScript系列文章目錄
深度學習系列文章目錄
01-【深度學習-Day 1】為什么深度學習是未來?一探究竟AI、ML、DL關系與應用
02-【深度學習-Day 2】圖解線性代數:從標量到張量,理解深度學習的數據表示與運算
03-【深度學習-Day 3】搞懂微積分關鍵:導數、偏導數、鏈式法則與梯度詳解
04-【深度學習-Day 4】掌握深度學習的“概率”視角:基礎概念與應用解析
05-【深度學習-Day 5】Python 快速入門:深度學習的“瑞士軍刀”實戰指南
06-【深度學習-Day 6】掌握 NumPy:ndarray 創建、索引、運算與性能優化指南
07-【深度學習-Day 7】精通Pandas:從Series、DataFrame入門到數據清洗實戰
08-【深度學習-Day 8】讓數據說話:Python 可視化雙雄 Matplotlib 與 Seaborn 教程
文章目錄
- Langchain系列文章目錄
- Python系列文章目錄
- PyTorch系列文章目錄
- 機器學習系列文章目錄
- 深度學習系列文章目錄
- Java系列文章目錄
- JavaScript系列文章目錄
- 深度學習系列文章目錄
- 前言
- 一、為什么需要數據可視化?
- 1.1 直觀理解數據
- 1.2 發現模式與趨勢
- 1.3 清晰傳達結果
- 二、Matplotlib:Python 可視化的基石
- 2.1 Matplotlib 簡介
- 2.1.1 什么是 Matplotlib?
- 2.1.2 安裝 Matplotlib
- 2.2 Matplotlib 核心概念
- 2.2.1 Figure 與 Axes
- 2.2.2 Pyplot 接口
- 2.3 繪制基本圖形
- 2.3.1 折線圖 (Line Plot)
- (1)應用場景
- (2)代碼示例
- 2.3.2 散點圖 (Scatter Plot)
- (1)應用場景
- (2)代碼示例
- 2.3.3 柱狀圖 (Bar Plot)
- (1)應用場景
- (2)代碼示例
- 2.4 圖像定制化
- 2.4.1 添加標題和標簽
- 2.4.2 修改顏色、線型和標記
- 2.4.3 添加圖例
- 2.4.4 代碼示例:綜合定制
- 三、Seaborn:讓可視化更美觀
- 3.1 Seaborn 簡介
- 3.1.1 什么是 Seaborn?
- 3.1.2 Seaborn 與 Matplotlib 的關系
- 3.1.3 安裝 Seaborn
- 3.2 使用 Seaborn 增強可視化
- 3.2.1 風格設置
- 3.2.2 常用繪圖函數
- (1)關系圖 (Relational Plots)
- (2)分類圖 (Categorical Plots)
- (3)分布圖 (Distribution Plots)
- (4)熱力圖 (Heatmaps)
- 3.2.3 代碼示例:使用 Seaborn 繪制美觀圖形
- 四、實戰:可視化 NumPy 與 Pandas 數據
- 4.1 使用 Matplotlib 可視化 NumPy 數組
- 4.1.1 場景描述
- 4.1.2 代碼示例
- 4.2 使用 Seaborn 可視化 Pandas DataFrame
- 4.2.1 場景描述
- 4.2.2 代碼示例
- 五、常見問題與選擇建議
- 5.1 Matplotlib vs Seaborn:何時選擇哪個?
- 5.2 圖像不顯示或中文亂碼問題
- (1)圖像不顯示
- (2)中文亂碼問題
- 六、總結
前言
在深度學習的征途中,我們不僅需要與冰冷的數字和復雜的算法打交道,更需要一種直觀的方式來理解數據、洞察模型行為并有效地展示研究成果。“一圖勝千言”,數據可視化正是連接數據與洞察的橋梁。它能夠幫助我們發現隱藏在數據背后的模式、趨勢和異常點,從而更好地指導我們的數據分析和模型調優工作。
在 Python 的生態系統中,Matplotlib 和 Seaborn 是兩個功能強大且廣受歡迎的數據可視化庫。Matplotlib 提供了靈活的底層繪圖接口,幾乎可以繪制任何類型的靜態、動態、交互式圖表。而 Seaborn 則構建于 Matplotlib 之上,提供了更高級別的接口,使得創建美觀且信息豐富的統計圖形變得更加容易。
本篇文章作為深度學習基礎準備階段的第八篇,將帶領大家系統學習如何使用 Matplotlib 和 Seaborn 這兩大神器,讓您的數據和模型結果“說話”,為后續的深度學習實踐打下堅實的視覺分析基礎。
一、為什么需要數據可視化?
在深入學習具體的繪圖庫之前,我們首先需要理解數據可視化為什么如此重要。簡單來說,數據可視化主要有以下三個方面的核心價值:
1.1 直觀理解數據
人類大腦對視覺信息的處理遠勝于對抽象數字的處理。通過將數據轉換成圖形,我們可以更快速、更直觀地把握數據的分布、集中趨勢、離散程度等關鍵特征。例如,一組看似雜亂無章的銷售數據,通過折線圖可以清晰地展示其隨時間的變化趨勢。
1.2 發現模式與趨勢
數據可視化是探索性數據分析(EDA)的關鍵環節。通過繪制不同類型的圖表,我們可以更容易地發現數據中隱藏的模式、相關性、聚類以及異常值。這些發現對于特征工程、模型選擇和問題診斷至關重要。例如,通過散點圖矩陣,我們可以快速識別不同特征之間的線性或非線性關系。
1.3 清晰傳達結果
無論是學術研究、商業報告還是項目演示,清晰、有效地傳達分析結果都至關重要。精美的圖表不僅能讓觀眾更容易理解復雜的分析結果,還能增強報告的說服力和專業性。一個精心設計的可視化作品,其傳遞信息的效率遠高于冗長的文字描述。
二、Matplotlib:Python 可視化的基石
Matplotlib 是 Python 中應用最廣泛的繪圖庫,它幾乎是所有其他 Python 可視化庫(包括 Seaborn)的基礎。學習 Matplotlib 能讓我們掌握最底層的繪圖邏輯,從而實現高度定制化的可視化需求。
2.1 Matplotlib 簡介
2.1.1 什么是 Matplotlib?
Matplotlib 是一個用于創建高質量靜態、動態和交互式可視化的 Python 庫。它提供了一個類似 MATLAB 的繪圖框架,使得用戶可以輕松生成各種類型的圖表,如折線圖、散點圖、柱狀圖、直方圖、餅圖等。Matplotlib 的設計理念是盡可能地讓簡單的事情簡單化,讓復雜的事情成為可能。
2.1.2 安裝 Matplotlib
在開始使用 Matplotlib 之前,我們需要先安裝它。如果您使用的是 Anaconda 或 Miniconda,可以通過以下命令在終端或 Anaconda Prompt 中安裝:
conda install matplotlib
如果您使用的是 pip,則可以使用以下命令:
pip install matplotlib
安裝完成后,我們就可以在 Python 腳本或 Jupyter Notebook 中導入并使用它了。
import matplotlib.pyplot as plt
import numpy as np # 通常與 NumPy 結合使用
2.2 Matplotlib 核心概念
理解 Matplotlib 的核心組件是高效使用它的關鍵。
2.2.1 Figure 與 Axes
在 Matplotlib 中,最頂層的容器是 Figure
,可以將其理解為一個畫布,所有的繪圖元素都將放置在這個畫布上。一個 Figure
對象可以包含一個或多個 Axes
對象。
Axes
(軸域)才是真正進行繪圖的區域,它代表了圖表中的一個子圖。一個 Axes
對象通常包含兩個(或三個,對于3D圖)Axis
對象(坐標軸),用于定義數據的范圍和刻度。我們可以在一個 Figure
上創建多個 Axes
,從而實現多子圖的布局。
2.2.2 Pyplot 接口
matplotlib.pyplot
是 Matplotlib 的一個模塊,它提供了一個類似 MATLAB 的命令式函數集合,用于快速、便捷地創建圖表。通常,我們將其導入為 plt
。pyplot
模塊會自動管理當前的 Figure
和 Axes
對象,使得我們可以直接調用繪圖函數而無需顯式地創建它們。
2.3 繪制基本圖形
接下來,我們將學習如何使用 pyplot
接口繪制幾種常見的圖形。
2.3.1 折線圖 (Line Plot)
折線圖通常用于顯示數據隨某個連續變量(如時間)變化的趨勢。
(1)應用場景
- 展示股票價格隨時間的變化。
- 顯示實驗測量值隨參數的變化。
- 可視化模型訓練過程中的損失值或準確率變化。
(2)代碼示例
import matplotlib.pyplot as plt
import numpy as np# 準備數據
x = np.linspace(0, 10, 100) # 生成0到10之間的100個點
y1 = np.sin(x)
y2 = np.cos(x)# 創建一個Figure和一個Axes
fig, ax = plt.subplots()# 繪制折線圖
ax.plot(x, y1, label='sin(x)') # 繪制 y1
ax.plot(x, y2, label='cos(x)') # 繪制 y2# 添加標題和標簽
ax.set_title('簡單折線圖示例')
ax.set_xlabel('X 軸')
ax.set_ylabel('Y 軸')# 添加圖例
ax.legend()# 顯示圖形
plt.show()
代碼解釋:
np.linspace(0, 10, 100)
: 創建一個包含100個從0到10等間隔的數值的NumPy數組。plt.subplots()
: 創建一個 Figure 對象和一個 Axes 對象。這是推薦的繪圖方式,可以更好地控制圖形的各個部分。ax.plot(x, y1, label='sin(x)')
: 在ax
(Axes對象) 上繪制折線圖。label
參數用于后續生成圖例。ax.set_title()
,ax.set_xlabel()
,ax.set_ylabel()
: 設置圖形的標題和坐標軸標簽。ax.legend()
: 顯示圖例,它會根據plot
函數中的label
參數自動生成。plt.show()
: 顯示繪制好的圖形。
2.3.2 散點圖 (Scatter Plot)
散點圖用于展示兩個變量之間的關系,每個點代表一個數據樣本。
(1)應用場景
- 觀察兩個特征之間的相關性。
- 識別數據中的聚類或異常點。
- 比較不同組別的數據分布。
(2)代碼示例
import matplotlib.pyplot as plt
import numpy as np# 準備數據
np.random.seed(0) # 設置隨機種子以保證結果可復現
x = np.random.rand(50) # 50個0到1之間的隨機數
y = 2 * x + 1 + np.random.randn(50) * 0.3 # y = 2x + 1 + 噪聲
colors = np.random.rand(50) # 為每個點生成隨機顏色
sizes = 100 * np.random.rand(50) # 為每個點生成隨機大小# 創建一個Figure和一個Axes
fig, ax = plt.subplots()# 繪制散點圖
scatter = ax.scatter(x, y, c=colors, s=sizes, alpha=0.7, cmap='viridis') # c=顏色, s=大小, alpha=透明度, cmap=顏色映射# 添加標題和標簽
ax.set_title('散點圖示例')
ax.set_xlabel('X 值')
ax.set_ylabel('Y 值')# 添加顏色條 (colorbar)
fig.colorbar(scatter, label='顏色值')# 顯示圖形
plt.show()
代碼解釋:
np.random.seed(0)
: 確保每次運行代碼時生成的隨機數都是一樣的,便于復現。ax.scatter()
: 繪制散點圖。c=colors
: 指定每個點的顏色。s=sizes
: 指定每個點的大小。alpha=0.7
: 設置點的透明度,當點重疊時很有用。cmap='viridis'
: 指定顏色映射方案,將colors
數組中的數值映射到具體的顏色。
fig.colorbar(scatter, label='顏色值')
: 為散點圖添加一個顏色條,用于解釋顏色與數值的對應關系。
2.3.3 柱狀圖 (Bar Plot)
柱狀圖用于比較不同類別的數據大小。
(1)應用場景
- 比較不同產品的銷量。
- 展示不同城市的人口數量。
- 可視化分類特征的頻數分布。
(2)代碼示例
import matplotlib.pyplot as plt# 準備數據
categories = ['類別 A', '類別 B', '類別 C', '類別 D']
values = [25, 40, 30, 50]# 創建一個Figure和一個Axes
fig, ax = plt.subplots()# 繪制柱狀圖
bars = ax.bar(categories, values, color=['skyblue', 'lightcoral', 'lightgreen', 'gold'])# 添加標題和標簽
ax.set_title('柱狀圖示例')
ax.set_xlabel('類別')
ax.set_ylabel('數量')# 在每個柱子上方顯示數值
for bar in bars:yval = bar.get_height()plt.text(bar.get_x() + bar.get_width()/2.0, yval + 1, round(yval, 1), ha='center', va='bottom')# 顯示圖形
plt.show()
代碼解釋:
ax.bar(categories, values, color=...)
: 繪制柱狀圖。color
參數可以是一個顏色列表,為每個柱子指定不同的顏色。- 循環部分 (
for bar in bars: ...
): 用于在每個柱子的頂部顯示其對應的數值,增強可讀性。bar.get_height()
: 獲取柱子的高度。bar.get_x()
: 獲取柱子左下角的 x 坐標。bar.get_width()
: 獲取柱子的寬度。plt.text()
: 在指定位置添加文本。
2.4 圖像定制化
Matplotlib 提供了豐富的選項來定制圖形的各個方面,使其更具表現力和美觀性。
2.4.1 添加標題和標簽
如前面的示例所示,可以使用 ax.set_title()
, ax.set_xlabel()
, ax.set_ylabel()
來為圖形和坐標軸添加標題和標簽。還可以通過 fontsize
參數調整字體大小。
ax.set_title('定制化標題', fontsize=16)
ax.set_xlabel('X 軸標簽', fontsize=12)
ax.set_ylabel('Y 軸標簽', fontsize=12)
2.4.2 修改顏色、線型和標記
在 plot
函數中,可以通過參數控制線條的顏色 (color)、線型 (linestyle) 和數據點的標記 (marker)。
- 顏色 (color): 可以使用預定義的顏色名稱(如 ‘red’, ‘blue’, ‘green’)、十六進制顏色碼(如 ‘#FF5733’)或 RGB 元組。
- 線型 (linestyle): 常用的有 ‘-’ (實線), ‘–’ (虛線), ‘:’ (點線), ‘-.’ (點劃線)。
- 標記 (marker): 用于標記數據點,如 ‘o’ (圓圈), ‘.’ (點), ‘,’ (像素), ‘s’ (正方形), ‘^’ (上三角)。
2.4.3 添加圖例
當一個圖形中包含多條線或多個數據集時,圖例 (legend) 就非常重要。通過在繪圖函數中設置 label
參數,然后調用 ax.legend()
即可顯示圖例。
ax.legend(loc='upper right', fontsize=10) # loc 參數可以控制圖例的位置
2.4.4 代碼示例:綜合定制
import matplotlib.pyplot as plt
import numpy as npx = np.linspace(0, 2 * np.pi, 50)
y_sin = np.sin(x)
y_cos = np.cos(x)fig, ax = plt.subplots(figsize=(8, 6)) # figsize 控制畫布大小ax.plot(x, y_sin,color='purple', # 線條顏色linestyle='--', # 線型為虛線linewidth=2, # 線條寬度marker='o', # 數據點標記為圓圈markersize=5, # 標記大小markerfacecolor='yellow', # 標記填充顏色markeredgecolor='red', # 標記邊緣顏色label='Sin Wave')ax.plot(x, y_cos,color='#2E8B57', # SeaGreen 的十六進制碼linestyle=':', # 線型為點線linewidth=2,marker='s',markersize=5,label='Cos Wave')ax.set_title('定制化折線圖', fontsize=18, fontweight='bold') # fontweight 設置字體粗細
ax.set_xlabel('弧度 (Radians)', fontsize=14)
ax.set_ylabel('函數值', fontsize=14)ax.grid(True, linestyle=':', alpha=0.7) # 添加網格線
ax.legend(loc='lower left', fontsize=12, shadow=True, frameon=True, facecolor='lightgray') # 更豐富的圖例設置# 設置坐標軸范圍
ax.set_xlim(0, 2 * np.pi)
ax.set_ylim(-1.5, 1.5)# 設置刻度
ax.set_xticks(np.linspace(0, 2 * np.pi, 5)) # 設置 X 軸刻度點
ax.set_xticklabels(['0', 'π/2', 'π', '3π/2', '2π']) # 設置 X 軸刻度標簽plt.tight_layout() # 自動調整子圖參數,使之填充整個圖像區域
plt.show()
代碼解釋:
figsize=(8, 6)
: 在創建 Figure 時指定其寬度和高度(單位為英寸)。linewidth
: 控制線條的寬度。markerfacecolor
,markeredgecolor
: 分別設置數據點標記的填充顏色和邊緣顏色。ax.grid(True, ...)
: 添加網格線,linestyle
和alpha
可以分別設置網格線的樣式和透明度。ax.legend(...)
: 提供了更多圖例定制選項,如shadow
(陰影),frameon
(邊框),facecolor
(背景色)。ax.set_xlim()
,ax.set_ylim()
: 設置 X 軸和 Y 軸的顯示范圍。ax.set_xticks()
,ax.set_xticklabels()
: 自定義坐標軸的刻度位置和標簽。plt.tight_layout()
: 自動調整布局,防止標簽重疊或超出邊界。
三、Seaborn:讓可視化更美觀
雖然 Matplotlib 功能強大且靈活,但有時為了創建具有統計意義且美觀的圖形,需要編寫較多的樣板代碼。Seaborn 的出現正是為了簡化這一過程,它提供了更高級別的接口,專注于統計可視化。
3.1 Seaborn 簡介
3.1.1 什么是 Seaborn?
Seaborn 是一個基于 Matplotlib 的 Python 數據可視化庫。它提供了一個高級界面,用于繪制引人入勝且信息豐富的統計圖形。Seaborn 的目標是使可視化成為數據探索和理解的核心部分。
3.1.2 Seaborn 與 Matplotlib 的關系
Seaborn 是建立在 Matplotlib 之上的。這意味著 Seaborn 使用 Matplotlib 來實際渲染圖形。因此,您通常可以將 Matplotlib 的定制命令與 Seaborn 圖形結合使用。可以理解為 Seaborn 是 Matplotlib 的一個更高級、更專注統計的封裝。
3.1.3 安裝 Seaborn
與 Matplotlib 類似,可以使用 conda 或 pip 安裝 Seaborn:
conda install seaborn
或者:
pip install seaborn
通常,我們會將 Seaborn 導入為 sns
:
import seaborn as sns
import matplotlib.pyplot as plt # 通常也需要導入 Matplotlib 進行微調
3.2 使用 Seaborn 增強可視化
Seaborn 的強大之處在于其內置的統計功能和美觀的默認樣式。
3.2.1 風格設置
Seaborn 提供了多種內置的主題和顏色方案,可以輕松改變圖形的整體外觀。
sns.set_theme(style="darkgrid") # 設置主題,可選:"whitegrid", "dark", "white", "ticks"
# sns.set_style("whitegrid") # 另一種設置風格的方式
# sns.set_palette("pastel") # 設置調色板
只需在繪圖代碼之前調用這些函數,后續的 Seaborn (甚至 Matplotlib) 圖形都會應用這些風格。
3.2.2 常用繪圖函數
Seaborn 提供了許多專門用于統計分析的繪圖函數,通常它們能夠更好地處理 Pandas DataFrame。
(1)關系圖 (Relational Plots)
用于可視化兩個變量之間的關系。
sns.relplot()
: Figure-level 接口,可以創建散點圖 (kind="scatter"
, 默認) 或線圖 (kind="line"
)。sns.scatterplot()
: Axes-level 散點圖。sns.lineplot()
: Axes-level 折線圖,可以自動計算聚合統計量(如均值和置信區間)。
(2)分類圖 (Categorical Plots)
用于可視化一個數值變量與一個或多個分類變量之間的關系。
sns.catplot()
: Figure-level 接口,支持多種分類圖,如:- 散點圖:
kind="strip"
(默認),kind="swarm"
- 分布圖:
kind="box"
,kind="violin"
,kind="boxen"
- 估計圖:
kind="point"
,kind="bar"
,kind="count"
- 散點圖:
- Axes-level 函數如
sns.boxplot()
,sns.violinplot()
,sns.barplot()
,sns.countplot()
,sns.stripplot()
,sns.swarmplot()
。
(3)分布圖 (Distribution Plots)
用于可視化單個變量的分布或多個變量的聯合分布。
sns.displot()
: Figure-level 接口,可以繪制直方圖 (kind="hist"
, 默認)、核密度估計圖 (kind="kde"
)、經驗累積分布函數圖 (kind="ecdf"
)。sns.histplot()
: Axes-level 直方圖。sns.kdeplot()
: Axes-level 核密度估計圖。sns.ecdfplot()
: Axes-level ECDF圖。sns.rugplot()
: 在軸上繪制小標記表示數據點。sns.jointplot()
: 繪制兩個變量的聯合分布和各自的邊緣分布。sns.pairplot()
: 繪制數據集中兩兩特征間的關系圖(散點圖或直方圖)。
(4)熱力圖 (Heatmaps)
用于將矩陣數據顯示為顏色編碼的圖像。
sns.heatmap()
: 非常適合可視化相關性矩陣、混淆矩陣等。
3.2.3 代碼示例:使用 Seaborn 繪制美觀圖形
import seaborn as sns
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np# 設置 Seaborn 風格
sns.set_theme(style="whitegrid")# 1. 使用 Seaborn 繪制折線圖 (自動處理置信區間)
fmri = sns.load_dataset("fmri") # 加載 Seaborn 內置數據集
plt.figure(figsize=(8, 5)) # Matplotlib 的 figure 設置仍然適用
sns.lineplot(x="timepoint", y="signal", hue="event", style="region", data=fmri)
plt.title('Seaborn 折線圖 (fMRI 數據)', fontsize=15)
plt.show()# 2. 使用 Seaborn 繪制散點圖,并按類別著色
iris = sns.load_dataset("iris") # 加載鳶尾花數據集
plt.figure(figsize=(8, 5))
sns.scatterplot(x="sepal_length", y="sepal_width", hue="species", size="petal_length", data=iris, palette="viridis", alpha=0.8)
plt.title('Seaborn 散點圖 (Iris 數據集)', fontsize=15)
plt.show()# 3. 使用 Seaborn 繪制箱線圖 (Box Plot)
tips = sns.load_dataset("tips") # 加載小費數據集
plt.figure(figsize=(8, 5))
sns.boxplot(x="day", y="total_bill", hue="smoker", data=tips, palette="Set2")
plt.title('Seaborn 箱線圖 (Tips 數據集)', fontsize=15)
plt.show()# 4. 使用 Seaborn 繪制熱力圖 (Heatmap)
# 創建一個隨機的相關性矩陣數據
np.random.seed(42)
data = pd.DataFrame(np.random.rand(10, 10), columns=[f'Var{i}' for i in range(1, 11)])
correlation_matrix = data.corr()
plt.figure(figsize=(10, 8))
sns.heatmap(correlation_matrix, annot=True, cmap="coolwarm", fmt=".2f", linewidths=.5)
# annot=True: 在單元格中顯示數值
# cmap="coolwarm": 設置顏色映射
# fmt=".2f": 設置數值格式(保留兩位小數)
# linewidths=.5: 設置單元格之間的線條寬度
plt.title('Seaborn 熱力圖 (相關性矩陣)', fontsize=15)
plt.show()
代碼解釋:
sns.load_dataset()
: Seaborn 提供了一些內置的數據集,方便學習和測試。hue
: Seaborn 的一個強大參數,可以根據指定的列對數據進行分組,并用不同的顏色、標記或線型來區分。style
: 類似于hue
,但用不同的標記或線型區分。palette
: 控制顏色方案。sns.boxplot()
: 直觀地展示了不同類別下數據的分布情況,包括中位數、四分位數和異常值。sns.heatmap()
: 將數值矩陣可視化為顏色編碼的圖,常用于展示相關性矩陣。annot=True
可以在每個單元格中顯示數值。
四、實戰:可視化 NumPy 與 Pandas 數據
在實際的數據分析和機器學習項目中,我們通常會使用 NumPy 存儲數值數組,使用 Pandas 存儲和處理表格數據 (DataFrame)。Matplotlib 和 Seaborn 都能很好地與這兩個庫集成。
4.1 使用 Matplotlib 可視化 NumPy 數組
4.1.1 場景描述
假設我們有一些通過 NumPy 生成或處理的實驗數據,例如某個物理量隨時間變化的測量值,我們希望將其可視化。
4.1.2 代碼示例
import matplotlib.pyplot as plt
import numpy as np# 生成模擬數據
time = np.arange(0, 10, 0.1) # 時間序列,從0到10,步長0.1
signal_A = np.exp(-time / 3.0) * np.sin(2 * np.pi * time) # 信號A:衰減正弦波
noise = np.random.normal(0, 0.1, len(time)) # 高斯噪聲
signal_B = signal_A + noise # 信號B:帶噪聲的信號A# 使用 Matplotlib 繪圖
fig, ax = plt.subplots(figsize=(10, 6))ax.plot(time, signal_A, label='原始信號 (Signal A)', color='blue', linestyle='-', linewidth=2)
ax.plot(time, signal_B, label='帶噪聲信號 (Signal B)', color='red', linestyle=':', linewidth=1.5, alpha=0.7)
# ax.scatter(time[::5], signal_B[::5], label='部分采樣點', color='green', marker='x') # 每隔5個點繪制一個標記ax.set_title('NumPy 數組可視化:信號與噪聲', fontsize=16)
ax.set_xlabel('時間 (s)', fontsize=14)
ax.set_ylabel('信號幅值', fontsize=14)
ax.legend(fontsize=12)
ax.grid(True, linestyle='--', alpha=0.6)plt.show()
這個例子展示了如何直接將 NumPy 數組傳遞給 Matplotlib 的 plot
函數進行繪圖,并進行相應的定制。
4.2 使用 Seaborn 可視化 Pandas DataFrame
4.2.1 場景描述
Pandas DataFrame 是處理結構化數據的標準方式。Seaborn 在設計上就非常適合直接操作 DataFrame,可以方便地根據列名來指定繪圖的變量。
4.2.2 代碼示例
假設我們有一個包含學生考試成績的 Pandas DataFrame,我們想分析不同科目成績的分布以及它們之間的關系。
import seaborn as sns
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np# 生成模擬學生成績數據
np.random.seed(123)
data = {'學生ID': range(1, 101),'數學成績': np.random.randint(50, 100, 100),'英語成績': np.random.randint(40, 95, 100),'科學成績': np.random.randint(60, 100, 100),'班級': np.random.choice(['A班', 'B班', 'C班'], 100, p=[0.3, 0.4, 0.3])
}
df_scores = pd.DataFrame(data)# 1. 查看各科目成績的分布 (直方圖與核密度估計)
plt.figure(figsize=(12, 6))
sns.histplot(data=df_scores, x='數學成績', hue='班級', kde=True, multiple="stack")
# multiple="stack" 可以將不同班級的直方圖堆疊起來
plt.title('數學成績分布 (按班級)', fontsize=15)
plt.show()# 2. 查看數學成績與英語成績之間的關系 (散點圖,按班級區分)
plt.figure(figsize=(8, 6))
sns.scatterplot(data=df_scores, x='數學成績', y='英語成績', hue='班級', style='班級', s=80)
plt.title('數學成績 vs 英語成績 (按班級)', fontsize=15)
plt.show()# 3. 查看所有數值型特征兩兩之間的關系 (配對圖)
sns.pairplot(df_scores[['數學成績', '英語成績', '科學成績', '班級']], hue='班級', diag_kind='kde')
# diag_kind='kde' 在對角線上繪制核密度估計圖
plt.suptitle('成績數據配對關系圖 (按班級)', y=1.02, fontsize=16) # 為整個 pairplot 添加總標題
plt.show()# 4. 查看不同班級各科成績的箱線圖
plt.figure(figsize=(10, 6))
sns.boxplot(data=pd.melt(df_scores, id_vars=['學生ID', '班級'], value_vars=['數學成績', '英語成績', '科學成績'],var_name='科目', value_name='成績'),x='班級', y='成績', hue='科目')
# pd.melt 用于將寬格式數據轉換為長格式數據,方便 boxplot 按科目分組
plt.title('各班級科目成績箱線圖', fontsize=15)
plt.show()
代碼解釋:
pd.melt()
: 這是一個非常有用的 Pandas 函數,可以將 DataFrame 從寬格式(每個科目一列)轉換為長格式(一列表示科目名稱,一列表示成績),這對于某些 Seaborn 繪圖函數(如boxplot
分組顯示多個科目)非常方便。sns.pairplot()
: 能夠快速生成數據集中數值型特征兩兩之間的散點圖,以及每個特征自身的分布圖(對角線上),是探索性數據分析的利器。- 在 Seaborn 函數中,
data
參數直接傳入 DataFrame,然后通過字符串列名指定x
,y
,hue
等。
五、常見問題與選擇建議
5.1 Matplotlib vs Seaborn:何時選擇哪個?
-
Matplotlib:
- 優點: 極致的靈活性和控制力,幾乎可以繪制任何類型的圖表,是底層繪圖庫。
- 缺點: 對于復雜或統計相關的圖形,代碼量可能較大,默認樣式相對樸素。
- 適用場景: 需要高度定制化圖形、繪制非標準圖表、進行精細的圖形元素控制、集成到大型應用中作為繪圖引擎。
-
Seaborn:
- 優點: 接口更高級,代碼簡潔,內置美觀的主題和調色板,專注于統計可視化,能很好地與 Pandas DataFrame 集成。
- 缺點: 靈活性不如 Matplotlib,主要針對特定類型的統計圖表。
- 適用場景: 快速探索性數據分析、繪制美觀的統計圖表(如分布圖、關系圖、分類圖、熱力圖等)、希望用更少的代碼獲得更好的視覺效果。
實踐建議:
- 對于簡單的、快速的繪圖或需要精細控制的場景,直接使用 Matplotlib。
- 對于統計分析和希望快速生成美觀圖形的場景,優先考慮 Seaborn。
- 通常兩者結合使用:使用 Seaborn 進行主體繪圖,然后使用 Matplotlib 的命令進行細節調整(如修改標題、標簽、添加注解等)。
5.2 圖像不顯示或中文亂碼問題
(1)圖像不顯示
- Jupyter Notebook/Lab: 通常會自動顯示。如果不行,可以嘗試在繪圖代碼的最后加上
plt.show()
。或者在 Notebook 開頭執行%matplotlib inline
(用于靜態圖) 或%matplotlib notebook
(用于交互式圖)。 - Python 腳本: 必須在繪圖代碼的最后調用
plt.show()
才能顯示圖形。
(2)中文亂碼問題
Matplotlib 默認的字體可能不支持中文。解決方法通常有兩種:
-
臨時指定字體:
from matplotlib.font_manager import FontProperties font = FontProperties(fname=r"c:\windows\fonts\simsun.ttc", size=12) # 指定一個支持中文的字體文件路徑# 在繪圖時指定 plt.title("中文標題", fontproperties=font) plt.xlabel("X軸-中文", fontproperties=font)
-
全局修改配置 (推薦):
import matplotlib.pyplot as plt import seaborn as sns# 一次性設置,后續繪圖均生效 plt.rcParams['font.sans-serif'] = ['SimHei'] # 指定默認字體為黑體 plt.rcParams['axes.unicode_minus'] = False # 解決保存圖像是負號'-'顯示為方塊的問題# seaborn 的風格設置也應該在這之后,或者單獨為 seaborn 的文本元素指定字體 # sns.set(font='SimHei') # 可以嘗試,但有時可能不完全覆蓋所有 seaborn 元素# ... 正常的繪圖代碼 ... plt.title("你好,世界!") plt.xlabel("X軸") plt.plot([1,2,3], [4,5,1]) plt.show()
你需要確保你的系統中安裝了
SimHei
(黑體) 或其他支持中文的字體。常見的可選字體有SimHei
(黑體),KaiTi
(楷體),FangSong
(仿宋),Microsoft YaHei
(微軟雅黑) 等。
六、總結
本篇文章詳細介紹了 Python 中兩個核心的數據可視化庫 Matplotlib 和 Seaborn,它們是進行數據分析和展示研究成果不可或缺的工具。
核心內容回顧:
- 數據可視化的重要性: 可視化幫助我們直觀理解數據、發現模式與趨勢,并清晰地傳達分析結果。
- Matplotlib:
- 是 Python 可視化的基石,提供底層的繪圖接口和高度的靈活性。
- 核心概念包括
Figure
(畫布) 和Axes
(子圖/繪圖區域)。 - 學習了如何繪制基本的折線圖、散點圖、柱狀圖,并對圖形進行定制(標題、標簽、顏色、線型、圖例等)。
- Seaborn:
- 構建于 Matplotlib 之上,提供更高級的接口,專注于創建美觀且信息豐富的統計圖形。
- 能夠輕松設置繪圖風格和調色板。
- 介紹了常用的繪圖函數,如關系圖 (
lineplot
,scatterplot
)、分類圖 (boxplot
,barplot
)、分布圖 (histplot
,kdeplot
,pairplot
) 和熱力圖 (heatmap
)。
- 實戰應用:
- 演示了如何結合 NumPy 使用 Matplotlib 進行數組數據的可視化。
- 展示了如何利用 Seaborn 的便利性直接對 Pandas DataFrame 進行復雜的可視化分析。
- 選擇與常見問題:
- 討論了 Matplotlib 和 Seaborn 的適用場景和選擇建議。
- 提供了解決圖像不顯示和中文亂碼問題的方案。
掌握 Matplotlib 和 Seaborn,將為您的數據探索之旅增添一雙銳利的眼睛。通過不斷實踐,您將能夠根據不同的數據和分析需求,靈活運用這兩個庫,創造出既美觀又富有洞察力的可視化作品。在后續的深度學習模型訓練和評估中,這些可視化技巧也將大放異彩。