我想用Cartopy在网格(LCC投影中)上绘制数据,以便数据填充整个轴(以及轴),但这不是问题。

更清楚地说,这是我对Cartopy的处理方式:

import cartopy.crs as ccrs
import numpy as np
import pyproj as p4
from mpl_toolkits.basemap import Basemap

lalo = #read latitudes and longitudes of my grid defined in a special LCC projection (below)

lat = np.reshape(lalo[:,1],(ny,nx))
lon = np.reshape(lalo[:,0],(ny,nx))
minlat = lat[0,0]
maxlat = lat[-1,-1]
minlon = lon[0,0]
maxlon = lon[-1,-1]
Z = np.ones((ny,nx)) #some data

#grid definition for cartopy:
myproj = ccrs.LambertConformal(central_longitude=13.3333, central_latitude=47.5,
                               false_easting=400000, false_northing=400000,
                               secant_latitudes=(46, 49))
fig = plt.figure()
ax = plt.axes(projection = myproj)
plt.contourf(lon, lat, Z)#, transform=myproj)
#no difference with transform option as lon,lat are already in myproj projection


结果是图像没有填充整个轴,但看起来像这样:


当使用像这样的底图时:

a=6377397.155
rf=299.1528128
b= a*(1 - 1/rf)
m = Basemap(projection='lcc', resolution='h', rsphere=(a,b),
        llcrnrlon=minlon,llcrnrlat=minlat,urcrnrlon=maxlon,urcrnrlat=maxlat,
        llcrnrx=400000, llcrnry=400000,
        lat_1=46, lat_2=49, lat_0=47.5, lon_0=13.3333, ax=ax)
x,y = m(lon,lat)
m.contourf(x,y,Z)


我得到以下(所需)图像:


最后,当使用proj4使用此定义p4.Proj('+proj=lcc +lat_1=46N +lat_2=49N +lat_0=47.5N +lon_0=13.3333 +ellps=bessel +x_0=400000 +y_0=400000')转换lon和lat时,我再次获得所需的图像:



也有可能在Cartopy中实现这一目标吗?

换句话说,我想绘制一个图,其中数据显示在一个完美的矩形中,并且背景图相应地失真,即类似此example的相反内容(无法安装iris包,否则我会尝试这个例子)

我尝试了一些类似的事情:


按照here完成的方式为我的投影构建一个自定义类,只是要确保所有参数均已正确设置(如在proj4定义中一样)。
aspect ratios一起玩,但它们只会影响轴,而不影响轴,
还有更多的东西。


任何帮助是极大的赞赏!

最佳答案

这里缺少的重要信息是您的数据以经度和纬度为单位,而不是在笛卡尔横向墨卡托坐标系中。结果,您将需要使用直角坐标系,该坐标系讲出纬度和经度(此时尚未实现球面轮廓)。这样的坐标系以PlateCarree crs的形式存在-因此,只要将其传递为轮廓数据的转换,就可以将数据放置在正确的位置。

plt.contourf(lon, lat, Z, transform=ccrs.PlateCarree())


这确实突出了一个事实,即数据的默认坐标系与地图的默认坐标系相同,在大多数情况下,该坐标系不是经度和纬度-更改数据的CRS的唯一方法是传递transform关键字。

高温超导

关于python - 地形图填充整个轴,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26398644/

10-11 03:57