4

我尝试只孵化具有统计显着性结果的区域。如何使用 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='/')
4

2 回答 2

4

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

(我使用cartopy而不是basemap,但这无关紧要。)

第 1 步:正常绘制字段 ( z),使用pcolormesh.

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

其中 x/y 可以是 lons/lats。

第 2 步:孵化整个地块。为此,请使用fill_between

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

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

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

import matplotlib as mpl
mpl.rcParams['hatch.linewidth'] = 0.3

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

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

以上其中一项将是您“孵化”的基础。这是它在第 2 步之后的样子:

这就是它在第 2 步之后的样子

第 3 步:在这两个之上,再次用 绘制您的颜色网格pcolormesh,这一次屏蔽包含统计显着值的单元格。这样,“无关紧要”细胞上的标记就会再次变得不可见,而重要的标记仍然可见。

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

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

然后,使用蒙版数组绘制颜色网格。

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

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

这就是它在第 3 步之后的样子

于 2021-09-04T23:33:21.997 回答
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()

其中掩码数组用于获取大于 0.3 的 z 值,这些值使用pcolor.

在此处输入图像描述

为了避免在顶部绘制另一种颜色(这样你只会得到阴影),我将 alpha 设置为 0。pcolor感觉有点像黑客。另一种方法是使用补丁并分配给您想要的区域。请参阅此Python 示例:Leave Numpy NaN values from matplotlib heatmap and its legend。对于底图等而言,这可能比仅选择带有pcolor.

于 2017-01-16T14:13:27.687 回答