一 python版本
python 3.9.3
二 问题描述
在学习Python绘图编程时,遇到一段源编程:
import numpy as np
import matplotlib.pyplot as plt
from colormaps import parula
np.random.seed(19680801)
plt.subplot(211)
plt.imshow(np.random.random((100,100)),cmap=parula)
plt.subplot(212)
plt.imshow(np.random.random((100,100)),cmap=parula)
书上给出运行结果为:
但是,在自己机器上测试,运行不通过,提示为 :
三 问题分析
不难发现,源程序开始调用parula的关键用意在于帮助后面程序里的imshow()函数的使用。如果清楚该函数功用,就可能对解决问题有帮助。 imshow() 函数定义如下: imshow(X, cmap=None, norm=None, aspect=None, interpolation=None, alpha=None, vmin=None, vmax=None, origin=None, extent=None, shape=None, filternorm=1, filterrad=4.0, imlim=None, resample=None, url=None, **kwargs) X:可以使类似数组的对象,或者是PIL类型图像,其中,数组对象可选shape为:(1)(M, N)二维数组,元素是标量数据。(2)(M, N, 3)RGB三通道图像,取值范围为0−1之间float或者0−255之间int。(3)(M, N, 4)RGBA图像,多出一维属性,透明度,其元素值和3通道的一样,取值范围为0−1之间float或0−255之间int。 cmap:str 或 matplotlib.colors.Colormap类型,用于将标量数据映射到颜色的Colormap实例或已注册的Colormap名称。因此,对应的语法有两种方式: (1)cmap=‘色带名称’(注意,用cmap时,需要加上引号)或者(2)plt.cm.色带名称。
四 解决措施
通过imshow()函数的了解,不难得到一下的解决方案: 1 删掉:from colormaps import parula。 2 如果需要某种色带,找到其对应的映射名称,如pink ,则将原程序中的cmap=‘ parula ’修改为plt.cm.pink或者cmap='pink’即可。全部的色带定义可参见https://matplotlib.org/网站。 3 通过https://matplotlib.org/网站可以看到,没有对应的 parula色带。后来查找资料发现:parula是matlab中对应的术语,而在python调用中,对应的是第一位,默认状态,用None表示 。所以,直接将cmap=parula删掉,或者改写为cmap=None均可。
五 程序修改与测试
1 测试程序代码(请注意,实现子图相同功能的四种不同语法表述):
import numpy as np
import matplotlib.pyplot as plt
np.random.seed(19680801)
plt.subplot(221)
plt.imshow(np.random.random((100, 100)),plt.cm.pink )
plt.subplot(222)
plt.imshow(np.random.random((100, 100)),cmap='plasma' )
plt.subplot(223)
plt.imshow(np.random.random((100, 100)), )
plt.subplot(224)
plt.imshow(np.random.random((100, 100)),cmap=None )
2 测试结果
可以看出,后面两个子图和原书上显示结果一致,问题得以解决。
六 附录:配色映射表
参考https://matplotlib.org/网站中的:文章:Choosing Colormaps in Matplotlib。网址为:https://matplotlib.org/stable/tutorials/colors/colormaps.html#sphx-glr-tutorials-colors-colormaps-py。这里将网址里面的色带映射图摘录如下,以方便大家参考: