matplotlib 使用簡明教程(六)-圖像、動畫相關
Matplotlib 提供的圖片功能
Matplotlib 只支持 PNG 類型的圖片,如果希望使用其他圖片格式,請安裝 Pillow,PIL(Python Imaging Library)的一個分支版本。
官方建議通過這個方式導入庫:
import matplotlib.image as mpimg
將矩陣繪製成圖像
使用 plt.imshow(X, **kwargs)
,重要參數:
- X:圖像參數,數據爲實數或整數
- MxN:,灰度
- MxNx3:RGB
- MxNx4:RGBA
- alpha:透明度,如果 X 參數中包含了透明度信息,則忽略
- cmap:顏色映射方式
- interpolation:圖片插補方式
- orgin:圖片起始位置,‘upper’ 爲左上角,‘lower’ 爲右下角
- aspect:寬高比
- ‘atuo’:適應 axes 來調整自己的寬高逼
- ‘equal’:axes 來適應圖像大小或 extent 參數(如果設置了的話)
- extent:圖片的起始位置,(左邊, 右邊, 底部, 上邊)
-
- cmap:顏色映射方式
- vmin,vmax:兩個數值,用於把輸入參數標準化到 [0,1] 內
或者使用 mpimg.pil_to_array(pilImage)
,將 PIL 對象轉換成矩陣
也可以使用 plt.matshow(A, fignum = None, **kwargs)
,與 imshow 的區別在於,A 只能是一個灰度的矩陣,參數和 imshow 的基本相同,fignum 定義了使用的 figure(畫布):
- None 即新打開一個畫布
- 整數 即使用整數所代表的畫布
- 0 或 False 即使用當前的畫布
將圖像存儲爲矩陣
使用 mpimg.imread(fname, format=None)
,參數說明:
- fname:圖片的文件地址、URL,或一個用二進制方式打開的文件對象
- format:圖片的格式,默認使用 fname 中的地址展示的文件格式
保存圖像爲文件
使用 mpimg.imsave(fname, arr, vmin=None, vmax=None, cmap=None, format=None, origin=None, dpi=100)
,重要參數說明:
- fname:文件路徑的字符串,或者是一個文件對象(使用二進制讀取)
- format:文件類型,如果未設置,根據 fname 的地址所展示的文件格式爲準
- arr:圖像參數,灰度、RGB 或 RGBA 格式,整數或實數
- vmin,vmax:兩個數值,用於把輸入參數標準化到 [0,1] 內
- cmap:顏色映射方式
- origin : 圖片起始位置,‘upper’ 爲左上角,‘lower’ 爲右下角
- dpi:圖像每英寸面積內的像素點數,並不影響圖片的分辨率
製作縮略圖
使用 mpimg.thumbnail(infile, thumbfile, scale=0.1, interpolation='bilinear', preview=False)
,參數說明:
- infile:圖片文件的路徑、或文件對象(使用二進制讀取)
- thumbfile:縮略圖文件的路徑、或文件對象(使用二進制打開)
- scale:縮放比例
- interpolation:圖片插補方式
- preview:是否預覽
interpolation,圖片插補方式
可接受:‘none’, ‘nearest’, ‘bilinear’, ‘bicubic’, ‘spline16’, ‘spline36’, ‘hanning’, ‘hamming’, ‘hermite’, ‘kaiser’, ‘quadric’, ‘catrom’, ‘gaussian’, ‘bessel’, ‘mitchell’, ‘sinc’, ‘lanczos’
Colormap,顏色映射
官方提供的 Colormap 可以通過 這裏 查詢,可以直接通過名稱在函數中調用,例如:
import numpy as np
import matplotlib.pyplot as plt
gradient = np.linspace(0, 1, 256)
gradient = np.vstack((gradient, gradient))
plt.imshow(gradient, cmap = 'YlOrRd') # 這裏使用 cmap = 'YlOrRd' 來使用這種顏色映射
plt.show()
Matplotlib 還提供了 matplotlib.cm
類用來自定義 Colormap,這裏不作介紹。
添加圖片背景
使用 plt.figimage()
來爲 Figure(畫布)添加圖片,注意這個不是作用在 axes 上的。
重要參數如下:
- X:圖片的數據
- xo, yo:圖片對於原點的偏移量,單位爲像素
- alpha:透明度
- norm:歸一化參數的實例
- cmap:顏色映射
- vmin, vmax : 用於把輸入參數標準化到 [0,1] 內
- origin:圖片起始位置,‘upper’ 爲左上角,‘lower’ 爲右下角
- resize:是否縮放
動畫繪製
參考網址:https://matplotlib.org/api/animation_api.html?highlight=animation
可以大概分成兩個部分:
- 用於處理動畫的類,包括
matplotlib.animation.FuncAnimation
類通過函數繪製動畫matplotlib.animation.ArtistAnimation
類通過一些現成的圖表繪製動畫
一個動畫處理的類,另一個是將動畫輸出
通過函數繪製動畫
matplotlib.animation.FuncAnimation(fig, func, frames=None, init_func=None, fargs=None, save_count=None, **kwargs)
類
初始化函數
參數包括:
- fig:將要繪製動畫的畫布
- func:繪製每一幀動畫時調用的函數,格式如
def func(frame, *fargs) -> iterable_of_artists:
,具體參數說明如下 - frames:一個數組、整數、派生器,或空,作爲 func 參數中每次調用的 frame 參數
- fargs:用於 func 函數中的其他參數,可選
- init_func:用於繪製初始畫布的函數,可選;如果沒有設置,則以第一幀的結果作爲初始畫布的結果
- save_count:frames 中緩存值的數量
- interval:每幀的間隔(毫秒),默認 200
- repeat_delay:再一次播放動畫前停止的時間
- repeat:是否重複播放
實際上 FuncAnimation 在工作時的機制更類似於:
for d in frames:
artists = func(d, *fargs)
fig.canvas.draw_idle()
fig.canvas.start_event_loop(interval)
動畫導出
最常使用 save(filename[, writer, fps, dpi, codec, ...])
成員函數,參數說明如下:
- filename:輸出文件名
- fps:每秒幀數,如果未設置,則以初始化函數中定義的 interval 作爲參數
- dpi:沒英寸的點數
- bitrate:視頻質量,每秒多少 kb,可選
- codec:編碼方式,可能需要結合
writer
參數使用 - writer:用於對動畫進行處理的對象,可以是一個字符串或者 MovieWriter 對象
- extra_anim:列表,其他一個需要合併的動畫,需要與當前動畫使用同一個畫布(Figure),可選
其他成員函數還包括:
to_html5_video(embed_limit=None)
to_jshtml([fps, embed_frames, default_mode])
通過已有圖表繪製動畫
matplotlib.animation.ArtistAnimation(fig, artists, interval, repeat_delay, repeat, blit)
類
初始化函數
參數說明如下:
- fig:將要繪製動畫的畫布
- artists:需要繪製的圖表(artists)列表
- interval:每幀的間隔(毫秒),默認 200
- repeat_delay:再一次播放動畫前停止的時間
- repeat:是否重複播放
- blit:是否使用“快傳輸”的方式優化繪製過程,
動畫導出
和 FuncAnimation 類一樣
Jupyter Notebook 注意事項
- 需要設置 backend 爲 notebook 或 nbagg,且選擇 notebook 時不支持背景顏色的變換
- 導出時需要使用
from IPython.display import HTMLHTML(ani.to_html5_video())
動畫渲染工具選擇
有幾種渲染工具類可供選擇,不做具體介紹。可以用於截取某些“幀”
-
使用 Pillow 庫,所有數據均在緩存中:
PillowWriter
介紹 -
基於管道(pipe-based),單獨使用一個進程來渲染動畫,效率更高,但是有些系統可能不適用:
-
基於文件(file-based),所有數據會緩存到文件中,速度慢一些,但是兼容性更好,易於排查問題
系列文章:
matplotlib 使用簡明教程(一)-基礎概念:
https://blog.csdn.net/fenghuizhidao/article/details/79352882
matplotlib 使用簡明教程(二)-常用圖表
https://blog.csdn.net/fenghuizhidao/article/details/83090043
matplotlib 使用簡明教程(三)-一些專業圖表簡介
https://blog.csdn.net/fenghuizhidao/article/details/83090165
matplotlib 使用簡明教程(四)-輔助性元件
https://blog.csdn.net/fenghuizhidao/article/details/83090249
matplotlib 使用簡明教程(五)-畫布、圖表、元素基礎操作
https://blog.csdn.net/fenghuizhidao/article/details/83090320
matplotlib 使用簡明教程(六)-圖像、動畫相關
https://blog.csdn.net/fenghuizhidao/article/details/83090512
matplotlib 使用簡明教程(七)-樣式定義
https://blog.csdn.net/fenghuizhidao/article/details/83090553