【问题标题】:Plotting netCDF data with Python: How to change grid?使用 Python 绘制 netCDF 数据:如何更改网格?
【发布时间】:2015-07-29 12:26:40
【问题描述】:

我是 python 的新手,使用 Matplotlib 绘制数据。我真的需要帮助,提前感谢您的回答。

所以,我有一个带有风数据 v 分量的 netCDF 文件。网格坐标:points=9600 (240x40)

lon : 0 to 358.5 by 1.5 degree_east circle

lat : 88.5 到 30 by -1.5 degree_north

我的代码是:

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")

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

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

问题是:我怎样才能改变网格的大小、重新网格化、插入数据或其他什么东西才能没有这个白色扇区?

【问题讨论】:

    标签: python matplotlib


    【解决方案1】:

    我找到了解决办法。在脚本的开头,你必须添加

    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

    【讨论】:

      【解决方案2】:

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

      检查this。有类似的问题。

      希望有用。

      【讨论】:

        【解决方案3】:

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

        我的解释是,是的,您没有 358.5 和 0 之间的数据,但您也没有 357 和 358.5 之间的数据。这似乎比跳过一个区域更有可能。这意味着来自 358.5 的数据应该接触来自 0 的数据,因为它与 0 与接触的 1.5 的距离一样远。

        复制最后一位将使您能够将 m.pcolor 调用更改为 imshow 调用(如在 Roman Dryndik's link 中)并使用插值来平滑图形。

        【讨论】:

        • 是的,你完全正确。但是我想创建一个脚本,该脚本适用于具有相同结构的大量文件的可视化,而无需花费时间来格式化文件本身。我已经找到了解决方案。非常感谢您的回答!
        猜你喜欢
        • 2017-01-15
        • 2018-06-20
        • 1970-01-01
        • 1970-01-01
        • 2023-03-31
        • 2015-08-11
        • 1970-01-01
        • 2014-12-22
        • 2020-12-06
        相关资源
        最近更新 更多