繁体   English   中英

使用Python绘制netCDF数据:如何更改网格?

[英]Plotting netCDF data with Python: How to change grid?

我是python中的新手,并使用Matplotlib绘制数据。 我真的需要帮助,在此先感谢您的回答。

因此,我有一个netCDF文件,其中包含风数据的v分量。 网格坐标:点= 9600(240x40)

lon:0到358.5 x 1.5度

纬度:88.5至30 x -1.5度

我的代码是:

import numpy as np
import matplotlib
matplotlib.use('Agg')
from netCDF4 import Dataset
from matplotlib.mlab import griddata
from matplotlib import pyplot as plt
from mpl_toolkits.basemap import Basemap

#read data from NETcdf file ".nc"
my_file = '/home/Era-Interim/NH-EraInt-1979.nc'
fh = Dataset(my_file, mode='r')

lons = fh.variables['lon'][:]
lats = fh.variables['lat'][:]
V = fh.variables['V'][:]
V_units = fh.variables['V'].units

fh.close()

# create figure
fig = plt.figure(figsize=(20,20))

# create a map
m = Basemap(projection='nplaea',boundinglat=30,lon_0=10,resolution='l',round=True)

#draw parallels, meridians, coastlines, countries, mapboundary
m.drawcoastlines(linewidth=0.5)
m.drawcountries(linewidth=0.5)
#m.drawmapboundary(linewidth=2)

m.drawparallels(np.arange(30,90,20), labels=[1,1,0,0])  #paral in 10 degree, right, left 
m.drawmeridians(np.arange(0,360,30), labels=[1,1,1,1])  #merid in 10 degree, bottom

#Plot the data on top of the map
lon,lat = np.meshgrid(lons,lats)
x,y = m(lon,lat)

cs = m.pcolor(x,y,np.squeeze(V),cmap=plt.cm.RdBu_r)

plt.title("", fontsize=25, verticalalignment='baseline')
plt.savefig("/home/Era-Interim/1.png")

结果,我收到了一张地图(可以在我的保管箱文件夹中找到) https://www.dropbox.com/sh/nvy8wcodk9jtat0/AAC-omkPP8_7uINSSXbzImeja?dl=0

在地图上,有358.5到0(360)lon之间的白色像素,因为我没有358.5到0(360)lon之间的数据。

问题是:如何更改网格的大小,对其重新定义,对数据进行插值或其他操作,以便不具有此白色扇区?

我找到了解决方案。 在脚本的开头,您必须添加

from mpl_toolkits.basemap import Basemap, addcyclic

并进一步

datain, lonsin = addcyclic(np.squeeze(Q), lons)
lons, Q = m.shiftdata(lonsin, datain = np.squeeze(Q), lon_0=180.)
print lons
lon, lat = np.meshgrid(lons, lats)
x,y = m(lon, lat)
cs = m.pcolor(x,y,datain,cmap=plt.cm.RdBu_r)

可以在图中看到差异(我仍然无法发布图像)。 https://www.dropbox.com/sh/nvy8wcodk9jtat0/AAC-omkPP8_7uINSSXbzImeja?dl=0

我认为在这种情况下,可以应用某种插值技术。

检查这个出来。 有类似的问题。

希望它是有用的。

简单的答案是360度为0度,因此您可以复制0度数据,它看起来应该正确。 不过,我可能会解释这种错误,因为我认为数据代表的是每个点的压力水平,而不是两个点之间的压力水平(即,零度之间,零度与1.5度之间)。

我的解释是,是的,您没有358.5到0之间的数据,但也没有357到358.5之间的数据。 这似乎不仅仅是跳过区域。 这意味着来自358.5的数据应该接触来自0的数据,因为距1.5接触的0远。

复制最后一位将使您能够将m.pcolor调用更改为imshow调用(如Roman Dryndik的链接中所述 ),并使用插值法使图形平滑。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM