这一直困扰着我。每当我使用cmap.set_under()
或cmap.set_over()
方法更改超出范围的值的颜色时,它们似乎将这些更改应用于我使用该色彩映射的所有实例。以下是我所指的一个例子。
import matplotlib.pyplot as plt
import numpy as np
rand_data = np.random.randint(50, size=(20,20))
plt.figure()
plt.subplot(211)
cmap1 = plt.cm.rainbow
im1 = plt.pcolormesh(rand_data, cmap=cmap1, vmin=10)
im1.cmap.set_under('w')
plt.colorbar(extend='min')
plt.subplot(212)
cmap2 = plt.cm.rainbow
im2 = plt.pcolormesh(rand_data, cmap=cmap2, vmin=10)
im2.cmap.set_under('k')
plt.colorbar(extend='min')
plt.show()
这里我试图创建两个相同值的图。在第一个图中,我希望10以下的所有值都是白色。在第二个图中,我希望10以下的所有值都是黑色。结果如下:
似乎第二次使用set_under
时,它会为使用彩虹色图的所有现有图重置set_under。如果我在第二个图中使用不同的颜色图,我可以设置不同的set_under
颜色:
更奇怪的是,如果在函数或脚本中使用cmap.set_under()
或cmap.set_over()
,退出该函数后此设置不会重置。也就是说,如果我注释掉我明确定义set_under
的行并且颜色重新运行我的脚本,我会得到与以前相同的结果。
所以我有几个问题:
有没有办法为单个图设置色图的越界值的颜色而不影响任何现有图的颜色图?
如何将越界值重置为原始颜色?
对于第二个问题,我知道我可以通过这样的方式手动添加原始颜色:
N = cmap.N
cmap.set_under(cmap(1))
cmap.set_over(cmap(N-1))
但是,我觉得应该有一种更简单的方法。
答案 0 :(得分:4)
您描述的行为是预期的。只存在一个色彩映射,即plt.cm.rainbow
。当您第一次set_under('w')
以及之后set_under('k')
时,under
的颜色将为黑色。
您要做的是实际使用同一色图的两个不同实例,然后将每个实例更改为下限的不同值。
这可以使用copy
,
cmap1 = copy.copy(plt.cm.rainbow)
现在操纵cmap1
并不会改变彩虹色图本身,以便以后可以创建它的另一个副本并应用不同的设置。
import matplotlib.pyplot as plt
import numpy as np
import copy
rand_data = np.random.randint(50, size=(20,20))
plt.figure()
plt.subplot(211)
cmap1 = copy.copy(plt.cm.rainbow)
im1 = plt.pcolormesh(rand_data, cmap=cmap1, vmin=10)
im1.cmap.set_under('w')
plt.colorbar(extend='min')
plt.subplot(212)
cmap2 = copy.copy(plt.cm.rainbow)
im2 = plt.pcolormesh(rand_data, cmap=cmap2, vmin=10)
im2.cmap.set_under('k')
plt.colorbar(extend='min')
plt.show()