2017-03-16 30 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

相關問題