2017-03-05 67 views
1

我有3組值的陣列,我想顏色:定義每個設置值的色彩映射表以陣列

  • 爲0和1(np.ma.masked_array(array, array > 1.))我想要的梯度之間的值(cmap = cm.Greens例如)
  • 爲等於2(np.ma.masked_array(array, array != 2.))我想要的顏色是紅色
  • 爲等於3(np.ma.masked_array(array, array != 3.))我要值的值的顏色是灰色

我應該爲每組數值定義一個色彩圖,然後將它們全部合併爲一個色彩圖?如果是這樣,我該如何繼續?

本網站(http://scipy.github.io/old-wiki/pages/Cookbook/Matplotlib/Show_colormaps)我發現像ListedColormapLinearSegmentedColormap這樣的選項可能會有幫助,但我真的不知道如何使用它來獲得我想要的。

編輯:我做了,它不工作,因爲我不知道如何使用ListedColormapLinearSegmentedColormap得到我想要的東西

from random import random 
import numpy as np 
import matplotlib.pyplot as plt 
import matplotlib.colors as mcolors 
from matplotlib import cm 
from matplotlib.colors import ListedColormap 

n=11 

tab = np.array([[random() for i in range(n)] for j in range(n)]) 
tab[1,2] = 2. 
tab[3,4] = 2. 
tab[5,6] = 3. 
tab[7,8] = 3. 

values1 = np.ma.masked_array(tab, tab > 1.) 
values2 = np.ma.masked_array(tab, tab != 2.) 
values3 = np.ma.masked_array(tab, tab != 3.) 

colors1 = cm.Greens 
colors2 = ListedColormap(['red'], 'indexed') 
colors3 = ListedColormap(['gray'], 'indexed') 

colors = np.vstack((colors1, colors2, colors3)) 
mycmap = mcolors.LinearSegmentedColormap.from_list('my_colormap', colors) 

print plt.imshow(tab, cmap = mycmap, interpolation="none") 
+0

你是正確的,你最好使用ListedColormap(如果值是離散的)或LinearSegmentedColormap(如果值是連續的)。只要沒有人知道你在執行這些任務時遇到了什麼問題,就無法幫助你。 – ImportanceOfBeingErnest

+0

我編輯了我的問題,我想要做的似乎是離散值和連續值的混合。 –

回答

2

一個ListedColormap最好用於離散值,而LinearSegmentedColormap更容易創建連續值。尤其是,如果應該使用現有的色彩圖,LinearSegmentedColormap是一個不錯的選擇。

LinearSegmentedColormap.from_list("name", colors)需要顏色列表colors(不是顏色地圖!)。該列表可以使用現有的色彩映射來創建,例如, greens = cm.Greens(np.linspace(0,1, num=50)),該地圖有50種顏色。對於覆蓋相同範圍的另一種顏色,我們可以添加相同數量的顏色,例如,全部是紅色或灰色。

一個例子如下。

from random import random 
import numpy as np 
import matplotlib.pyplot as plt 
import matplotlib.colors as mcolors 
from matplotlib import cm 

n=11 
tab = np.array([[random() for i in range(n)] for j in range(n)]) 
tab[1,2] = 2. 
tab[3,4] = 2. 
tab[5,6] = 3. 
tab[7,8] = 3. 

values1 = np.ma.masked_array(tab, tab > 1.) 
values2 = np.ma.masked_array(tab, tab != 2.) 
values3 = np.ma.masked_array(tab, tab != 3.) 

# 50 values for later use from 0 to 1 
greens = cm.Greens(np.linspace(0,1, num=50)) 
# 25 values for later use from 1 to 1.5 
greensfill = cm.Greens(np.ones(25)) 
# 50 values red for later use from 1.5 to 2.5 
red = [(1,0,0,1)]*len(greens) 
# 50 values gray for later use from 2.5 to 3.5 
gray = [(.5,.5,.5,1)]*len(greens) 

colors = np.vstack((greens, greensfill, red, gray)) 
# in total we now have 175 colors in the colormap 
mycmap = mcolors.LinearSegmentedColormap.from_list('my_colormap', colors) 

#we now map those 175 colors to the range between 0 and 3.5 
im = plt.imshow(tab, cmap = mycmap, interpolation="none", vmin=0, vmax=3.5) 
cb = plt.colorbar(im) 
cb.set_ticks([0,1,2,3]) 

plt.show() 

enter image description here

在這裏,從該列表中的顏色的顏色表最後被相等地間隔開。

另一種方法是指定伴隨各個值的顏色。

colors = [(0, "white"), (1./3.5, "green"), (1.5/3.5, "green"), 
      (1.501/3.5, "red"), (2.5/3.5, "red"), (2.501/3.5, "gray"), (1, "gray") ] 
mycmap = mcolors.LinearSegmentedColormap.from_list('my_colormap', colors) 
+0

謝謝,很好的解釋! –