【问题标题】:Hatch area using pcolormesh in Basemap在底图中使用 pcolormesh 填充区域
【发布时间】:2017-05-30 14:39:03
【问题描述】:

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

【问题讨论】:

    标签: python matplotlib matplotlib-basemap significance hatchstyle


    【解决方案1】:

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

    (我使用cartopy 而不是basemap,但这不重要。)

    第 1 步: 使用 pcolormesh 正常绘制您的字段 (z)。

    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的详细信息以设置xminxmaxy1y2。您只需在绘图边界之外定义两条水平线,并在其间的区域设置阴影线。使用更多或更少/s 来设置孵化密度。

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

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

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

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

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

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

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

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

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

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

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

    【讨论】:

    • 在第 3 步(铺设最后一个蒙版的颜色网格)之后,在没有蒙版的地方,绘图边框会变细。无法弄清楚为什么。如果有人可以重现此问题,并且确实有修复,请提出修改建议。谢谢。
    【解决方案2】:

    似乎pcolormesh 不支持孵化(见https://github.com/matplotlib/matplotlib/issues/3058)。相反,建议使用pcolor,从this 开始的示例看起来像,

    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 填充。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-08-25
      • 2017-10-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多