2016-11-21 3 views
0

Скажем, я хочу отличить NaN в цветовой палитре matplotlib. Тогда:Маска двух групп значений в цветовой палитре matlotlib с постепенной схемой цветов

import numpy as np 
import matplotlib.pyplot as plt 
import matplotlib 

# create a (4,5) matrix with values ranging from 0 to 19 
np_data = np.arange(20).reshape((4,5)).astype(float) 
# add a row with NaNs in the middle 
np_data = np.insert(np_data,2,[np.nan for x in range(0,5)],axis=0) 
# mask invalid data (NaNs) 
np_data = np.ma.masked_invalid(np_data) 

# get figure and ax objects from plot 
fig, ax = plt.subplots() 
# Draw an "X" on transparent values (masked values) 
ax.patch.set(hatch='x', edgecolor='blue') 

# get a predefined color scheme 
reds_cm = plt.get_cmap("Reds") 
# Plot heatmap, add a colorbar and show it 
heatmap = ax.pcolor(np_data, cmap=reds_cm) 
cbar = fig.colorbar(heatmap) 
plt.show() 

Сюжеты: heatmap

Теперь NaNs легко идентифицировать на графике.

Теперь, скажем, я хочу иметь возможность легко разделить между NaNs, 0s и остальными значениями.

Если я сейчас замаскирую 0s, я не смогу сказать NaNs и 0s друг от друга.

Как я могу отличить 2 группы значений в цветовой палитре? В этом случае NaNs с одной стороны и 0s в другом.

+0

Соответствующие вопросы здесь http://stackoverflow.com/questions/35905393/python-leave-numpy-nan-values-from-matplotlib-heatmap-and-its-legend/35905483 # 35905483 и http://stackoverflow.com/questions/16120481/matplotlib-grayscale-heatmap-with-visually-distinct-na-squares-fields – ImportanceOfBeingErnest

ответ

0

Я нашел this answer от @unutbu в несвязанном вопросе. Я адаптировал свой ответ на мою проблему, а также установил, что новые люки также включены в ячейки NaN. Чтобы этого избежать, просто доберите ячейки со значением 0 до маскирования массива numpy (я бы прокомментировал его ответ, чтобы указать на это в контексте, но у меня нет необходимой репутации). Я только включаю код, измененный из моего вопроса.

# (previous imports) 
# Import to add patches to "non transparent" cells 
import matplotlib.patches as mpatches 


# (generate np_data) 

# Get mask positions of 0 values before masking NaNs so NaN cells aren't included 
cells_with_0 = np_data == 0 
# mask invalid data (NaNs) 
np_data = np.ma.masked_invalid(np_data) 

# (get color scheme, plot heatmap, plot colorbar) 

#set the background color as gray so the transparent values (NaNs here) use that color 
ax.patch.set_facecolor((0.6, 0.6, 0.6, 1.0)) 
# Draw an "X" on transparent values (masked values) 
ax.patch.set(hatch='x', edgecolor='black') 
# Put an x over cells which have value 0 
for j, i in np.column_stack(np.where(cells_with_0)): 
     ax.add_patch(
      mpatches.Rectangle(
       (i, j),  # (x,y) 
       1,   # width 
       1,   # height 
       fill=False, 
       edgecolor='blue', 
       snap=False, 
       hatch='x' # the more slashes, the denser the hash lines 
     )) 

plt.show() 

Новый Heatmap: enter image description here

+0

Я думаю, что вопросник хочет получить решение с помощью 'pcolor'. Добавление большого количества прямоугольников может не всегда быть хорошим решением. – ImportanceOfBeingErnest

2

В случае, если вы хотите сказать аппарт первого или последнего значение вашей палитры следующее решением является хорошим способом пойти. Вы можете изменить цветовой код таким образом, чтобы эти значения стали совсем другим цветом.

reds_cm = plt.get_cmap("name of colormap") 
# init colormap such that its members are available 
reds_cm._init() 
# set the first value to black 
reds_cm._lut[0,: ] = (0,0,0,1) #this is an RGBA tuple 
# set the last value to lightgreen 
reds_cm._lut[-4:,: ] = np.array([149,238,58,255])/255. 

Полное описание доступно на следующих языках: английский.

import numpy as np 
import matplotlib.pyplot as plt 

# create a (4,5) matrix with values ranging from 0 to 19 
np_data = np.arange(20).reshape((4,5)).astype(float) 
# add a row with NaNs in the middle 
np_data = np.insert(np_data,2,[np.nan for x in range(0,5)],axis=0) 
# mask invalid data (NaNs) 
np_data = np.ma.masked_invalid(np_data) 

# get figure and ax objects from plot 
fig, ax = plt.subplots() 
# Draw an "X" on transparent values (masked values) 
ax.patch.set(hatch='x', edgecolor='blue') 

# get a predefined color scheme 
reds_cm = plt.get_cmap("Reds") 
# init colormap such that its members are available 
reds_cm._init() 
# set the first value to black 
reds_cm._lut[0,: ] = (0,0,0,1) 
# set the last value to lightgreen 
reds_cm._lut[-4:,: ] = np.array([149,238,58,255])/255. 

# Plot heatmap, add a colorbar and show it 
heatmap = ax.pcolor(np_data, cmap=reds_cm) 
cbar = fig.colorbar(heatmap) 
plt.show() 

производства enter image description here