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