Подтвердить что ты не робот

Pcolormesh с отсутствующими значениями?

У меня есть 3 1-D ndarrays: x, y, z

и следующий код:

import numpy as np
import matplotlib.pyplot as plt
import scipy.interpolate as spinterp

## define data
npoints = 50
xreg = np.linspace(x.min(),x.max(),npoints)
yreg = np.linspace(y.min(),y.max(),npoints)
X,Y = np.meshgrid(xreg,yreg)
Z = spinterp.griddata(np.vstack((x,y)).T,z,(X,Y),
                      method='linear').reshape(X.shape)

## plot
plt.close()
ax = plt.axes()
col = ax.pcolormesh(X,Y,Z.T)
plt.draw()

Мой сюжет выходит пустым, и я подозреваю, что это потому, что метод = 'linear' интерполяция выходит с nans. Я пробовал преобразовать в маску в маске, но безрезультатно - сюжет по-прежнему пуст. Можете ли вы сказать мне, что я делаю неправильно? Спасибо.

4b9b3361

Ответ 1

Получил это. Это кажется круглым, но это решение:

import numpy.ma as ma

Zm = ma.masked_where(np.isnan(Z),Z)
plt.pcolormesh(X,Y,Zm.T)

Если матрица Z содержит nan 's, она должна быть маскированным массивом для pcolormesh, который должен быть создан с помощью ma.masked_where или, альтернативно,

Zm = ma.array(Z,mask=np.isnan(Z))

Ответ 2

Небольшое улучшение по выбранному ответу

import numpy.ma as ma
Zm = ma.masked_invalid(Z)
plt.pcolormesh(X, Y, Zm.T)

masked_invalid маскирует все значения NaN, тем самым сохраняя необходимость указывать

mask = np.isnan(Z)

Ответ 3

Обратите внимание, что явное маскирование больше не требуется в master файле matplotlib, поскольку массивы теперь автоматически маскируются автоматически. Будет включен в matplotlib > 2.1. См. Мой запрос с объединенным выводом matplotlib/matplotlib # 5451

Итак, теперь это так же просто, как

plt.pcolormesh(X,Y,Z.T)