Я пытаюсь использовать imshow в matplotlib для построения данных в виде тепловой карты, но некоторые из значений являются NaN. Я бы хотел, чтобы NaN отображались как особый цвет, которого нет в цветовой карте.
пример:
import numpy as np
import matplotlib.pyplot as plt
f = plt.figure()
ax = f.add_subplot(111)
a = np.arange(25).reshape((5,5)).astype(float)
a[3,:] = np.nan
ax.imshow(a, interpolation='nearest')
f.canvas.draw()
Результирующее изображение неожиданно становится полностью синим (самый низкий цвет на карте цветов струи). Однако, если я сделаю такой график:
ax.imshow(a, interpolation='nearest', vmin=0, vmax=24)
- тогда я получаю что-то получше, но значения NaN отображаются того же цвета, что и vmin ... Есть ли изящный способ, которым я могу настроить отображение NaN особым цветом (например, серым или прозрачным)?
python
matplotlib
nan
Адам Фрейзер
источник
источник
matplotlib.__version__=='1.2.1'
) это работает без проблем.Ответы:
В более новых версиях Matplotlib больше нет необходимости использовать замаскированный массив.
Например, давайте сгенерируем массив, в котором каждое 7-е значение является NaN:
arr = np.arange(100, dtype=float).reshape(10, 10) arr[~(arr % 7).astype(bool)] = np.nan
Мы можем изменить текущую цветовую карту и построить массив со следующими строками:
current_cmap = matplotlib.cm.get_cmap() current_cmap.set_bad(color='red') plt.imshow(arr)
источник
arr = np.ma.array(arr, mask=(arr == 0))
.Хм, похоже, я могу использовать для этого замаскированный массив:
masked_array = np.ma.array (a, mask=np.isnan(a)) cmap = matplotlib.cm.jet cmap.set_bad('white',1.) ax.imshow(masked_array, interpolation='nearest', cmap=cmap)
Этого должно быть достаточно, хотя я все еще открыт для предложений. :]
источник
matplotlib.cm.jet
, так что я обычно делаю копию:import copy; cmap=copy.copy(matplotlib.cm.jet)
. Кроме того, если вы хотите установить нулевые значения для другого цвета,cmap._init(); cm._lut[:,0] = (1,1,1,1)
должно работать что-то вроде .set_over
иset_under
для контроля окраски значений вне диапазона. Поведение по умолчанию - соответствие верху / низу цветового диапазона.masked_array
требуется вообще? Еслиa
содержит значения NaN (так кажетсяmask=np.isnan(a)
), то простоеimshow
добавление массиваa
с настроенной картойcmap
отобразит NaN-ячейки нужного цвета (белый). Так что у меня это работает. Есть ли исключения?nan
значения и медианные значения отображались одного цвета, например белого.