如何使用python和basemap绘制不规则间隔的RGB图像?
考虑到我有三个矩阵来描述我想要绘制的数据:如何使用python和basemap绘制不规则间隔的RGB图像?,python,matplotlib-basemap,Python,Matplotlib Basemap,考虑到我有三个矩阵来描述我想要绘制的数据: lons-具有[n_lons,n_lats]的二维矩阵 lats-具有[n_lons,n_lats]的二维矩阵 dataRGB-具有[n长,n宽,3]的三维矩阵 使用python和basemap绘制此类数据的首选方法是什么 对于伪彩色数据,使用pcolormesh方法非常简单: 数据-二维矩阵,带[n_lons,n_lats] m=基本映射(…) m、 pcolormesh(lons,lats,data,latlon=True) 通过阅读文档,
- lons-具有[n_lons,n_lats]的二维矩阵
- lats-具有[n_lons,n_lats]的二维矩阵
- dataRGB-具有[n长,n宽,3]的三维矩阵
- 数据-二维矩阵,带[n_lons,n_lats] m=基本映射(…) m、 pcolormesh(lons,lats,data,latlon=True)
有没有其他方法来绘制数据?我不久前遇到了同样的问题,这是我能想到的唯一解决方案: (请注意,这适用于matplotlib 1.3.0,,但不适用于1.1.0) 假设var是您感兴趣的变量(NxMx3),lats是(N)x(M),lons是(N)x(M): 我们需要将像素中心lat/lons转换为像素角lat/lons(N+1)x(M+1) 获取坐标角点 屏蔽无效的数据 我们需要一个扁平元组(N*M,3)来传递给pcolormesh 设置更大的线宽将导致更大的边失真,并且 由于某些原因,较小的线宽将导致图像失真。
感谢分享您的解决方案!对我来说,pcolormesh似乎忽略了color关键字。此外,我还必须将线宽设置为零,否则每个像素都会绘制一个周围的多边形,从而有效地渲染黑色图像。是的,您可能需要修改线宽。基本上,如果我将线宽设置为0,则得到的图像与使用pcolor而不是pcolormesh打印图像时得到的图像相同。是否在0.0-1.0范围内而不是在0-255范围内输入颜色元组?实际上,我有MISR数据()的rgb图片,我用这段代码将其覆盖在底图背景上,所以它应该可以工作。你能分享你的LAT、LON和rgb元组的3x3数组吗?这个解决方案几乎适用于我,但我的图像被打乱了
from mpl_toolkits.basemap import Basemap
import numpy.ma as ma
import numpy as np
m = Basemap() #Define your map projection here
cornerLats=getCorners(lat);cornerLons=getCorners(lon)
xCorners,yCorners=m(cornerLats,cornerLons,inverse=True)
var=ma.masked_where(np.isnan(var),var)
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