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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章