【问题标题】:How to plot an irregular spaced RGB image using python and basemap?如何使用 python 和底图绘制不规则间隔的 RGB 图像?
【发布时间】:2014-04-08 23:39:06
【问题描述】:

鉴于我有三个矩阵来描述我想要绘制的数据:

  • lons - 具有 [n_lons,n_lats] 的二维矩阵
  • lats - 带有 [n_lons,n_lats] 的二维矩阵
  • dataRGB - 具有 [n_lons,n_lats,3] 的 3D 矩阵

使用 python 和底图绘制此类数据的首选方法是什么。

对于伪彩色数据,使用 pcolormesh 方法非常简单:

  • 数据 - 具有 [n_lons,n_lats] 的 2D 矩阵

    m = 底图(...)

    m.pcolormesh(lons,lats,data,latlon=True)

通过阅读文档,在我看来,在这种情况下应该使用 imshow 命令,但是对于这种方法,需要定期网格化数据,我必须重新网格化并插入我的数据。

还有其他方法可以绘制数据吗?

【问题讨论】:

    标签: python matplotlib-basemap


    【解决方案1】:

    不久前我遇到了同样的问题,这是我能想到的唯一解决方案:

    (请注意,这适用于 matplotlib 1.3.0,但不适用于 1.1.0

    from mpl_toolkits.basemap import Basemap
    
    import numpy.ma as ma
    import numpy as np
    
    m = Basemap() #Define your map projection here
    

    假设 var 是您感兴趣的变量 (NxMx3),lats 是 (N)x(M),lons 是 (N)x(M):

    我们需要将像素中心的纬度/经度转换为像素角的经度/经度 (N+1)x(M+1)

    cornerLats=getCorners(lat);cornerLons=getCorners(lon)
    

    获取坐标角

    xCorners,yCorners=m(cornerLats,cornerLons,inverse=True)
    

    屏蔽无效数据

    var=ma.masked_where(np.isnan(var),var)
    

    我们需要一个扁平的元组(N*M,3) 来传递给 pcolormesh

    colorTuple=tuple(np.array([var[:,:,0].flatten(),var[:,:,1].flatten(),var[:,:,2].flatten()]).transpose().tolist())
    

    设置较大的线宽会导致更多的边缘变形,而一个

    由于某种原因,较小的线宽会导致图像出错。

    m.pcolormesh(xCorners,yCorners,var[:,:,0],color=colorTuple,clip_on=True,linewidth=0.05)
    
    def getCorners(centers):
    
        one = centers[:-1,:]
        two = centers[1:,:]
        d1 = (two - one) / 2.
        one = one - d1
        two = two + d1
        stepOne = np.zeros((centers.shape[0] + 1,centers.shape[1]))
        stepOne[:-2,:] = one
        stepOne[-2:,:] = two[-2:,:]
        one = stepOne[:,:-1]
        two = stepOne[:,1:]
        d2 = (two - one) / 2.
        one = one - d2
        two = two + d2
        stepTwo = np.zeros((centers.shape[0] + 1,centers.shape[1] + 1))
        stepTwo[:,:-2] = one
        stepTwo[:,-2:] = two[:,-2:]
        return stepTwo
    

    【讨论】:

    • 感谢分享您的解决方案!对我来说,pcolormesh 似乎忽略了 color 关键字。我还必须将线宽设置为零,否则会为每个像素绘制一个周围的多边形,从而有效地呈现黑色图像。
    • 是的,你可能不得不修改线宽。本质上,如果我设置 linewidth=0,我会得到相同的图像,就像我用 pcolor 而不是 pcolormesh 绘制图像一样。您是否在 0.0 - 1.0 范围内输入 colorTuple 而不是 0-255?我实际上有 MISR 数据 (www-misr.jpl.nasa.gov) 的 rgb 图片,我使用此代码覆盖到底图背景上,所以它应该可以工作。你能分享你的 lats、lons 和 rgb 元组的 3x3 数组吗?
    • 这个解决方案几乎对我有用,但我的图像被打乱了
    猜你喜欢
    • 2015-05-27
    • 2014-05-26
    • 1970-01-01
    • 2013-03-09
    • 2023-04-02
    • 2017-05-14
    • 2012-04-22
    • 2017-10-04
    • 1970-01-01
    相关资源
    最近更新 更多