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

时间:2014-03-06 11:12:02

标签: python matplotlib-basemap

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

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

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

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

  • 数据 - 带[n_lons,n_lats]的二维矩阵

    m =底图(...)

    m.pcolormesh(LONS,拉特,数据,latlon =真)

从阅读文档中,我觉得在这种情况下应该使用imshow命令,但对于这种方法,需要定期网格化数据,我必须重新编译和插入我的数据。

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

1 个答案:

答案 0 :(得分: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):

我们需要将像素中心lat / lons转换为像素转角lat / lons(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