2017-03-16 366 views
0

这是一直困扰我一段时间的东西。无论何时我使用cmap.set_under()cmap.set_over()方法更改超出界限值的颜色,它们似乎都会将这些更改应用于使用该颜色映射的所有实例。以下是我所指的一个例子。使用'set_under'或'set_over'后重置默认的matplotlib色彩值

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颜色:

enter image description here

更为离奇的,如果在一个函数或脚本使用cmap.set_under()cmap.set_over(),此设置不会重置后退出该功能。也就是说,如果我注释掉我明确定义set_under和颜色重新运行脚本的行,我会得到与以前相同的结果。

所以我有几个问题:

  1. 有没有一种方法来设置一个图一个颜色映射出界外值的颜色,而不会影响任何现有地块的颜色表?

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

对于第二个问题,我知道我可以做这样的事情手动添加回原来的颜色:

N = cmap.N 
cmap.set_under(cmap(1)) 
cmap.set_over(cmap(N-1)) 

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

回答

1

您所描述的行为是预期的。目前只有一个色彩图,即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() 

enter image description here

+0

谢谢!我甚至没有考虑制作色彩映射的副本。我想我的印象是使用'im.cmap。set_under()'而不是'cmap.set_under'只会改变'im'中使用的颜色映射的实例。但是,你的解释很有道理。 – nikobam

相关问题