簡體   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