маскирующая часть контурного участка в matplotlib - PullRequest
10 голосов
/ 21 марта 2012

Я пытаюсь создать заполненный контурный график в matplotlib, используя contourf. Данные отсутствуют в виде зубчатой ​​структуры в нижней части графика. График контура оказывается пустым не только там, где маскируются исходные данные, но также и в карманах, где алгоритм контура не может интерполировать чисто из-за недостаточной окрестности хороших данных.

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

В предыдущей теме я узнал, как сделать это для изображения, построив первое изображение, а затем накрыв его другим изображением, маскирующим плохие области. Аналогом будет фрагмент кода, приведенный ниже, но он не работает для контура ... Я не могу заставить imshow bad_data скрыть расширенный график контура. Возможно ли это?

Спасибо, Eli

import matplotlib.pyplot as plt
lev = [0.0,0.1,0.2,0.5,1.0,2.0,4.0,8.0,16.0,32.0]           
norml = colors.BoundaryNorm(lev, 256)
# this is the contour plot, using extended_data so that the contours are plausibly extended
cs = plt.contourf(x,z,extended_data,levels = lev, cmap = cm.RdBu_r,norm = norml) 
# now the attempt to cover it up -- but imshow will not cover up the original plot as it will with another image
bad_data = np.ma.masked_where(~data.mask, data.mask, copy=True) 
plt.imshow(bad_data, interpolation='nearest', aspect = 'auto', cmap=cm.gray)
plt.show()

1 Ответ

12 голосов
/ 22 октября 2013

Поправьте меня, если я ошибаюсь, но, насколько я понимаю, у вас есть такая ситуация:

import numpy as np
import matplotlib.pyplot as plt
# generate some data with np.nan values (the missing values)
d = np.random.rand(10, 10)
d[2, 2], d[3, 5] = np.nan, np.nan
# and in your case you actually have masked values too:
d = np.ma.array(d, mask=d < .2)
# now all of the above is just for us to get some data with missing (np.nan) and
# masked values

Путем нанесения вышеупомянутого с контуром,

plt.contourf(d)
plt.show()

я получаю:

enter image description here

, который не показывает (пусто) ни маскированные значения (d <.2), ни значения np.nan (d [2, 2], d [3, 5])!и вы хотите, чтобы matplotlib только не показывал маскированные значения.Таким образом, мы можем сделать это: </p>

# the following line is replaced by your interpolation routine for
# removing np.nan values
d[np.isnan(d)] = 1
# then because we use the masked array only the masked values will still be masked
# but the np.nan values which were replaced through the interpolation algorithm
# will show up if we do the contourf plot
plt.contourf(d)
plt.show()

enter image description here

Я не знаю, насколько быстро в этом случае используется маскированный массив, но в любом случае я бы так и сделал,Если вы хотите использовать другой цвет вместо пустых пятен (ничуть), вам нужно закрасить участок под осями, потому что контур не отображает ничего там, где нет данных или замаскированных данных:

# make the background dark gray (call this before the contourf)
plt.gca().patch.set_color('.25')
plt.contourf(d)
plt.show()

чтобы получить:

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...