在底图中使用 pcolormesh 填充区域

Zor*_*ran 5 python matplotlib significance hatchstyle matplotlib-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='/')
Run Code Online (Sandbox Code Playgroud)

Ed *_*ith 5

似乎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()
Run Code Online (Sandbox Code Playgroud)

其中掩码数组用于获取大于 0.3 的 z 值,并且这些值使用 进行孵化pcolor

在此输入图像描述

为了避免在顶部绘制另一种颜色(这样你只能得到阴影线),我将 alpha 设置为 0。这pcolor感觉有点像黑客。另一种方法是使用 patch 并分配到您想要的区域。请参阅此示例Python:从 matplotlib heatmap 及其图例中保留 Numpy NaN 值。对于底图等来说,这可能比仅仅选择带有 的区域更棘手pcolor


Oza*_*ürk 5

对于这个问题,我有一个简单的解决方案,仅使用pcolormesh而不pcolor使用:绘制颜色网格,然后对整个图进行孵化,然后再次绘制原始网格,这次通过屏蔽统计上显着的单元格,以便唯一可见的孵化是那些在重要的细胞。或者,您可以在每个单元格上放置一个标记(看起来也不错),而不是对整个图形进行孵化。

(我使用cartopy代替basemap,但这不重要。)

第 1 步:z使用 正常绘制场 ( ) pcolormesh

mesh = plt.pcolormesh(x,y,z)
Run Code Online (Sandbox Code Playgroud)

其中 x/y 可以是经度/纬度。

第 2 步:绘制整个图。为此,请使用fill_between

hatch = plt.fill_between([xmin,xmax],y1,y2,hatch='///////',color="none",edgecolor='black')
Run Code Online (Sandbox Code Playgroud)

检查fill_between设置xminxmaxy1和的详细信息y2。您只需在绘图边界之外定义两条水平线,并在其间绘制阴影区域。使用更多或更少的/s 来设置填充密度。

要调整剖面线厚度,请使用以下行:

import matplotlib as mpl
mpl.rcParams['hatch.linewidth'] = 0.3
Run Code Online (Sandbox Code Playgroud)

作为孵化所有内容的替代方法,您可以将所有 xy 点(或经纬度对)绘制为标记。一个简单的解决方案是加一个点(x 看起来也不错)。

hatch = plt.plot(x,y,'.',color='black',markersize=1.5)
Run Code Online (Sandbox Code Playgroud)

上述之一将成为您“孵化”的基础。这就是第 2 步之后的样子:

这就是第 2 步之后的样子

步骤 3:在这两者之上,再次使用 绘制颜色网格pcolormesh,这次屏蔽包含统计显着值的单元格。这样,“不重要”细胞上的标记将再次变得不可见,而重要的标记仍然可见。

假设您有一个大小相同的数组,其中包含每个单元格 ( ) 的t 统计量t_z,您可以使用 的 模块屏蔽重要numpyma

z_masked = numpy.ma.masked_where(t_z >= your_threshold, z)
Run Code Online (Sandbox Code Playgroud)

然后,使用屏蔽数组绘制颜色网格。

mesh_masked = plt.pcolormesh(x,y,z_masked)
Run Code Online (Sandbox Code Playgroud)

用于zorder确保图层顺序正确。这就是第三步之后的样子:

这就是第 3 步之后的样子