我正在尝试使用 Geoviews 绘制 WRF 输出。WRF 输出文件包含纬度和经度信息,它们都是二维数组。
所以我目前正在尝试的是:
- 使用 Cartopy 的投影定义,计算一维 x/y 坐标
- 修改 my
xr.Dataset
使其具有这些 1D x/y 坐标 gv.Dataset
从中创建一个xr.Dataset
,提供 WRFcrs
(这是 Lambert Conformal,顺便说一句)gv.Image
从中绘制一个gv.Dataset
xr.Dataset
看起来像这样:
<xarray.Dataset>
Dimensions: (Time: 48, low_mid_high: 3, south_north: 210, west_east: 210)
Coordinates:
* Time (Time) datetime64[ns] 2016-08-22 2016-08-22T00:30:00 ...
* low_mid_high (low_mid_high) <U4 'low' 'mid' 'high'
* south_north (south_north) float64 -3.7e+06 -3.699e+06 -3.698e+06 ...
* west_east (west_east) float64 6.629e+06 6.627e+06 6.626e+06 ...
Data variables:
cloudfrac (low_mid_high, Time, south_north, west_east) float32 0.533683 ...
我的代码如下所示:
import geoviews as gv
import wrf
import xarray as xr
cldfrac = xr.open_dataset(FILENAME)
# create the ccrs object for the WRF projection
prj = wrf.get_cartopy(cldfrac._file_obj.ds)
# calculate x/y in Lambert Conformal proj,
# drop original XLONG/XLAT
cldfrac = ASSIGN_XY_COORDS(cldfrac)
geo_dims = ['south_north', 'west_east']
kdims = ['low_mid_high', 'south_north', 'west_east', 'Time']
vdims = ['cloudfrac']
dataset = gv.Dataset(cldfrac, kdims=kdims, vdims=vdims, crs=prj)
dataset.to(gv.Image, geo_dims, crs=ccrs.PlateCarree())
我确实得到了一个结果,但是它不是在经度/纬度投影中,而是在原始的 Lambert Conformal 中,意思是 ysouth_north
和west_east
x 轴。
根据Geoviews 网站,
两个后端都可以通过大多数 GeoViews 对象的 crs 参数在任何受支持的投影中使用传入数据。
如何在图像中将经度/纬度作为 x 和 y 轴?
编辑:如果可能的话,我更喜欢使用 Bokeh 后端。实际上,我并不关心刻度标签,但图中的投影是错误的:当 x/y 轴代表 lon/lat 时,如 WebMercator 投影中,并在gv.Image()
调用中使用我的 LambertConformal 数据投影,我希望图像的区域为非正方形(在北半球,上边缘的左右距离应大于图像范围的下边缘)。