人工智能之數據分析 Matplotlib
第五章 常見函數
(文章目錄)
前言
在 Matplotlib 中,除了常用的 plot、scatter、bar 等繪圖函數外,還有一些圖像處理和樣式控制相關的常用函數,如 imshow、imsave、imread,以及解決中文顯示問題的方法。此外,Seaborn 作為基於 Matplotlib 的高級可視化庫,也常與之配合使用。
本文將系統介紹這些內容:
一、Matplotlib 圖像處理三劍客:imread / imshow / imsave
⚠️ 注意:從 Matplotlib 3.6 起,
matplotlib.pyplot.imread和imsave已被棄用(deprecated),推薦改用 Pillow(PIL) 或 imageio。但為兼容舊代碼,仍可使用(部分版本會警告)。
1. plt.imread() —— 讀取圖像
import matplotlib.pyplot as plt
img = plt.imread('photo.jpg') # 返回 numpy.ndarray (H, W, C)
print(img.shape) # 如 (480, 640, 3) 表示 RGB 圖像
- 支持格式:PNG、JPEG、TIFF 等(依賴 Pillow)
- 返回值:
float32(0~1)或uint8(0~255),取決於文件
✅ 推薦替代(現代方式):
from PIL import Image import numpy as np img = np.array(Image.open('photo.jpg'))
2. plt.imshow() —— 顯示圖像
plt.imshow(img)
plt.axis('off') # 關閉座標軸(圖像通常不需要)
plt.title("My Photo")
plt.show()
常用參數:
| 參數 | 説明 |
|---|---|
cmap |
顏色映射,用於灰度圖,如 'gray', 'viridis' |
vmin, vmax |
控制顏色範圍(歸一化) |
interpolation |
插值方式,如 'nearest', 'bilinear' |
✅ 顯示灰度圖示例:
gray_img = plt.imread('lena.png') # 假設是單通道
plt.imshow(gray_img, cmap='gray')
✅ 顯示熱力圖(矩陣):
data = np.random.rand(10, 10)
plt.imshow(data, cmap='hot', interpolation='nearest')
plt.colorbar()
plt.show()
3. plt.imsave() —— 保存圖像數組為圖片文件
plt.imsave('output.png', img, cmap='gray') # 若為灰度圖需指定 cmap
✅ 推薦替代:
from PIL import Image Image.fromarray(img_uint8).save('output.png') # 注意 dtype 應為 uint8
二、其他常見 Matplotlib 函數
| 函數 | 用途 |
|---|---|
plt.figure(figsize=(w, h)) |
創建新圖形,設置尺寸(英寸) |
plt.subplot(nrows, ncols, index) |
創建子圖 |
plt.subplots() |
一次性創建 figure + axes(推薦) |
plt.tight_layout() |
自動調整子圖間距,避免重疊 |
plt.savefig('file.png', dpi=300, bbox_inches='tight') |
高清保存圖像 |
plt.close() |
關閉當前圖形(防止內存泄漏) |
plt.gca() / plt.gcf() |
獲取當前座標軸 / 圖形對象 |
plt.xlim(), plt.ylim() |
設置座標軸範圍 |
plt.xticks(), plt.yticks() |
自定義刻度標籤 |
三、中文顯示問題解決方案
Matplotlib 默認不支持中文字體,直接使用中文會導致 方框或亂碼。
✅ 方法一:全局設置中文字體(推薦)
import matplotlib.pyplot as plt
# Windows 常用字體
plt.rcParams['font.sans-serif'] = ['SimHei'] # 黑體
# macOS 可用:['Arial Unicode MS'] 或 ['PingFang HK']
# Linux 可用:['WenQuanYi Micro Hei']
plt.rcParams['axes.unicode_minus'] = False # 正常顯示負號(如 -1)
# 測試
plt.plot([1, 2, 3], [1, 4, 9])
plt.title("中文標題測試")
plt.xlabel("X軸")
plt.show()
✅ 方法二:指定字體路徑(跨平台通用)
from matplotlib import font_manager
# 加載字體文件(如 SimHei.ttf)
font_path = "C:/Windows/Fonts/simhei.ttf" # Windows 示例
my_font = font_manager.FontProperties(fname=font_path)
plt.plot([1, 2, 3], [1, 4, 9])
plt.title("中文標題", fontproperties=my_font)
plt.xlabel("X軸", fontproperties=my_font)
plt.show()
💡 提示:可通過以下代碼查看系統可用字體:
from matplotlib.font_manager import findSystemFonts print([f for f in findSystemFonts() if 'hei' in f.lower() or 'song' in f.lower()])
四、Matplotlib 與 Seaborn 協同使用
Seaborn 是基於 Matplotlib 的高級統計可視化庫,語法更簡潔,配色更美觀。
安裝
pip install seaborn
基本用法
import seaborn as sns
import matplotlib.pyplot as plt
import pandas as pd
# 設置 Seaborn 樣式(會自動應用到 Matplotlib)
sns.set_style("whitegrid") # 還有 "darkgrid", "ticks", "white"
sns.set_palette("Set2") # 配色方案
# 示例:繪製帶回歸線的散點圖
tips = sns.load_dataset("tips")
sns.scatterplot(data=tips, x="total_bill", y="tip", hue="time")
plt.title("小費數據分佈(Seaborn + Matplotlib)")
plt.show()
混合使用技巧
- Seaborn 繪圖後,仍可用
plt.title()、plt.xlabel()等 Matplotlib 函數進一步定製。 - 使用
plt.figure()或plt.subplots()控制畫布佈局,再傳入 Seaborn 的ax參數:
fig, ax = plt.subplots(figsize=(8, 5))
sns.boxplot(data=tips, x="day", y="total_bill", ax=ax)
ax.set_title("Box Plot with Seaborn on Matplotlib Axes")
plt.show()
常用 Seaborn 函數 vs Matplotlib
| 分析目標 | Seaborn | Matplotlib |
|---|---|---|
| 分佈 | sns.histplot(), sns.kdeplot() |
plt.hist() |
| 相關性 | sns.heatmap(df.corr()) |
plt.imshow() + 手動標註 |
| 分類比較 | sns.barplot(), sns.boxplot() |
plt.bar(), plt.boxplot() |
| 散點關係 | sns.scatterplot() |
plt.scatter() |
✅ 建議:探索性數據分析用 Seaborn,精細控制或出版級圖表用 Matplotlib 面向對象 API。
總結
| 功能 | 推薦做法 |
|---|---|
| 讀/寫圖像 | 優先用 PIL.Image 或 imageio,而非 imread/imsave |
| 顯示圖像/熱力圖 | plt.imshow() + cmap + colorbar() |
| 中文顯示 | plt.rcParams['font.sans-serif'] = ['SimHei'] |
| 美化圖表 | sns.set_style() + Matplotlib 定製 |
| 複雜佈局 | plt.subplots() + ax 對象傳給 Seaborn |
後續
python過渡項目部分代碼已經上傳至gitee,後續會逐步更新。
資料關注
公眾號:咚咚王 gitee:https://gitee.com/wy18585051844/ai_learning
《Python編程:從入門到實踐》 《利用Python進行數據分析》 《算法導論中文第三版》 《概率論與數理統計(第四版) (盛驟) 》 《程序員的數學》 《線性代數應該這樣學第3版》 《微積分和數學分析引論》 《(西瓜書)周志華-機器學習》 《TensorFlow機器學習實戰指南》 《Sklearn與TensorFlow機器學習實用指南》 《模式識別(第四版)》 《深度學習 deep learning》伊恩·古德費洛著 花書 《Python深度學習第二版(中文版)【純文本】 (登封大數據 (Francois Choliet)) (Z-Library)》 《深入淺出神經網絡與深度學習+(邁克爾·尼爾森(Michael+Nielsen)》 《自然語言處理綜論 第2版》 《Natural-Language-Processing-with-PyTorch》 《計算機視覺-算法與應用(中文版)》 《Learning OpenCV 4》 《AIGC:智能創作時代》杜雨+&+張孜銘 《AIGC原理與實踐:零基礎學大語言模型、擴散模型和多模態模型》 《從零構建大語言模型(中文版)》 《實戰AI大模型》 《AI 3.0》