如何使用Python和Basemap绘制不规则间隔的RGB图像?

4

假设我有三个矩阵,它们描述了我想绘制的数据:

  • lons - 2D矩阵,大小为[n_lons,n_lats]
  • lats - 2D矩阵,大小为[n_lons,n_lats]
  • dataRGB - 3D矩阵,大小为[n_lons,n_lats,3]

使用python和basemap绘制此类数据的首选方法是什么?

对于伪彩色数据,可以使用pcolormesh方法非常简单地完成绘制:

  • data - 2D矩阵,大小为[n_lons,n_lats]

    m = Basemap(...)

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

从文档中可以看出,在这种情况下应该使用imshow命令,但是这种方法需要规则网格化的数据并且需要重新网格化和插值我的数据。

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

1个回答

2
我之前遇到过同样的问题,这是我能想到的唯一解决方法:
(请注意,这适用于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忽略了颜色关键字。此外,我不得不将线宽设置为零,否则每个像素都会绘制一个周围的多边形,从而有效地呈现出黑色图像。 - Andre
是的,你可能需要调整线宽。如果我将linewidth设置为0,那么得到的图像与使用pcolor而不是pcolormesh绘制的图像相同。你是否在0.0-1.0范围内输入了colorTuple,而不是0-255?我实际上有MISR数据(http://www-misr.jpl.nasa.gov/)的RGB图片,我用这段代码将其叠加在basemap背景上,所以应该可以工作。你能分享一个3x3的lats、lons和rgb元组数组吗? - Jim
1
这个解决方案对我来说几乎有效,但我的图像被搞乱了。 - blaylockbk

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接