假设我有三个矩阵来描述我要绘制的数据:
lons-2D矩阵
lats-二维矩阵,带[núlons,núlats]
dataRGB-具有[núlons,núlats,3]的三维矩阵
使用python和basemap绘制此类数据的首选方法是什么。
对于伪彩色数据,使用pcolormesh方法非常简单:
数据-二维矩阵
m=基本地图(…)
m.pcolormesh(lons,lats,data,latlon=True)
从阅读文档来看,在这种情况下似乎应该使用imshow命令,但对于这种方法,需要定期对数据进行网格化,我必须重新网格化并插值数据。
有没有其他方法来绘制数据?
最佳答案
我不久前也遇到过同样的问题,这是我唯一能想到的解决办法:
(注意,这适用于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
关于python - 如何使用python和 basemap 绘制不规则间隔的RGB图像?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22222733/