使用'set_under'或'set_over'后重置默认的matplotlib颜色图值

nik*_*bam 3 python matplotlib colormap

这已经困扰了我一段时间了。每当我使用cmap.set_under()or 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()
Run Code Online (Sandbox Code Playgroud)

在这里,我试图创建两个具有相同值的图。在第一个图中,我希望所有低于10的值都为白色。在第二个图中,我希望所有低于10的值都为黑色。结果是这样的:

看来我第二次使用set_under它为所有使用彩虹色图的现有图重置了set_under。如果在第二个绘图中使用其他颜色图,则可以设置其他set_under颜色:

在此处输入图片说明

更奇怪的是,如果在函数或脚本中使用cmap.set_under()或使用cmap.set_over()该函数,则退出该函数后不会重置此设置。也就是说,如果我注释掉我显式定义的行,set_under并且color重新运行了脚本,则得到的结果与以前相同。

所以我有几个问题:

  1. 有没有一种方法可以为单个图设置颜色图的边界值的颜色,而不会影响任何现有图的颜色图

  2. 如何将越界值重置为其原始颜色?

对于第二个问题,我知道可以通过执行以下操作来手动添加原始颜色:

N = cmap.N
cmap.set_under(cmap(1))
cmap.set_over(cmap(N-1))
Run Code Online (Sandbox Code Playgroud)

但是,我觉得应该有一个更简单的方法。

Imp*_*est 5

您描述的行为是预期的。仅存在一个颜色图,即plt.cm.rainbow。当您第一次set_under('w')或之后set_under('k'),的颜色under将为黑色。

您要做的实际上是使用同一色彩图的两个不同实例,然后将每个实例更改为下限具有不同的值。
这可以很容易地使用完成copy

cmap1 = copy.copy(plt.cm.rainbow)
Run Code Online (Sandbox Code Playgroud)

现在,操作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()
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明