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