Como posso plotar os valores da NAN como uma cor especial com o IMSHOW no matplotlib?

StackOverflow https://stackoverflow.com/questions/2578752

  •  24-09-2019
  •  | 
  •  

Pergunta

Estou tentando usar o IMSHOW no matplotlib para plotar os dados como um mapa de calor, mas alguns dos valores são NANs. Eu gostaria que os Nans fossem renderizados como uma cor especial não encontrada no Colormap.

exemplo:

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()

A imagem resultante é inesperadamente toda azul (a cor mais baixa no Jet Colormap). No entanto, se eu fizer a trama assim:

ax.imshow(a, interpolation='nearest', vmin=0, vmax=24)

-Então eu recebo algo melhor, mas os valores da NAN são desenhados da mesma cor que o VMIN ... Existe uma maneira graciosa de definir que Nans sejam desenhados com uma cor especial (por exemplo: cinza ou transparente)?

Foi útil?

Solução

HRM, parece que posso usar uma matriz mascarada para fazer isso:

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)

Isso deve ser suficiente, embora ainda esteja aberto a sugestões. :

Outras dicas

Com versões mais recentes do Matplotlib, não é mais necessário usar uma matriz mascarada.

Por exemplo, vamos gerar uma matriz em que cada 7º valor é uma nan:

arr = np.arange(100, dtype=float).reshape(10, 10)
arr[~(arr % 7).astype(bool)] = np.nan

Podemos modificar o colorido atual e plotar a matriz com as seguintes linhas:

current_cmap = matplotlib.cm.get_cmap()
current_cmap.set_bad(color='red')
plt.imshow(arr)

plot result

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top