Область штриховки с использованием pcolormesh в Basemap

Я стараюсь выводить только те регионы, где у меня есть статистически значимые результаты. Как я могу сделать это, используя Basemap и pcolormesh?

plt.figure(figsize=(12,12))

lons = iris_cube.coord('longitude').points
lats = iris_cube.coord('latitude').points

m = Basemap(llcrnrlon=lons[0], llcrnrlat=lats[0], urcrnrlon=lons[-1], urcrnrlat=lats[-1], resolution='l')

lon, lat = np.meshgrid(lons, lats)

plt.subplot(111)

cs = m.pcolormesh(lon, lat, significant_data, cmap=cmap, norm=norm, hatch='/')

2 ответа

Похоже на то pcolormesh не поддерживает штриховку (см. https://github.com/matplotlib/matplotlib/issues/3058). Вместо этого совет должен использовать pcolorкоторый, начиная с этого примера, будет выглядеть так:

import matplotlib.pyplot as plt
import numpy as np

dx, dy = 0.15, 0.05
y, x = np.mgrid[slice(-3, 3 + dy, dy),
                slice(-3, 3 + dx, dx)]
z = (1 - x / 2. + x ** 5 + y ** 3) * np.exp(-x ** 2 - y ** 2)
z = z[:-1, :-1]
zm = np.ma.masked_less(z, 0.3)

cm = plt.pcolormesh(x, y, z)
plt.pcolor(x, y, zm, hatch='/', alpha=0.)
plt.colorbar(cm)
plt.show()

где массив масок используется для получения значений z больше 0,3, и они заштрихованы с помощью pcolor,

введите описание изображения здесь

Чтобы избежать нанесения другого цвета поверх (так что вы получаете только штриховку), я установил альфа на 0. в pcolor что немного похоже на взломать. Альтернатива - использовать патч и назначать области, которые вы хотите. Посмотрите этот пример Python: оставьте значения Numpy NaN из тепловой карты matplotlib и ее легенды. Это может быть более сложным для базовых карт и т. Д., Чем просто выбор областей с pcolor,

Если вы не против использовать маркер ( . или x или + или на заказ), чтобы показать каждую статистически значимую ячейку, то ниже мой хак, использующий только, а не pcolor. Я также использую cartopy вместо того basemap, но это не имеет значения.

Шаг 1. Постройте поле ( z) обычно, используя.

      mesh = plt.pcolormesh(x,y,z)

Шаг 2: Вдобавок к этому нарисуйте все свои точки xy (или пары долгота-широта) в качестве маркеров. Простое решение - поставить точку. Это будет выглядеть нормально, но да, штриховки не будет.

      hatch = plt.plot(x,y,'.',color='black',markersize=1.5)

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

      hatch = plt.plot(x,y,marker=[(-1,-0.82),(1,0.82)],linestyle="None",color='black',markersize=8,markeredgewidth=0.4)

Маркер - это линия внутри вашей ячейки здесь, от (-1,-0.82) к (1,0.82). Отрегулируйте его конечные точки в соответствии с соотношением сторон вашей ячейки (идеального решения нет, поскольку некоторые ячейки сетки меняют форму географически).

Вышесказанное будет основой вашего «вылупления». Вот как это должно выглядеть после шага 2:

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

Предполагая, что у вас есть массив одинакового размера, содержащий статистику t для каждой ячейки ( t_z), вы можете замаскировать значимые значения, используя numpyс ma модуль.

      z_masked = numpy.ma.masked_where(t_z >= your_threshold, z)

Затем постройте цветовую сетку, используя маскированный массив.

      mesh_masked = plt.pcolormesh(x,y,z_masked)

Использовать zorderчтобы убедиться, что слои находятся в правильном порядке. Вот как это должно выглядеть после шага 3:

Не идеальная «штриховка», но выглядит довольно красиво и пригодно для публикации, ИМХО. Попробуйте также другие маркеры / маркеры другого размера.

Другие вопросы по тегам