爱气象,爱气象家园! 

气象家园

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博登陆

只需一步, 快速开始

搜索
查看: 16837|回复: 10

[求助] python 绘制grd文件 缺省值的处理

[复制链接]

新浪微博达人勋

发表于 2020-1-16 14:20:18 | 显示全部楼层 |阅读模式

登录后查看更多精彩内容~

您需要 登录 才可以下载或查看,没有帐号?立即注册 新浪微博登陆

x
各位前辈,我这几天在学习接触python,我在使用python绘制grd降水文件,也就是中国气象数据网的降水资料,但是里面存在-999的缺省值,我不知道怎么处理,才能和NCL或者grads一样达到效果,请前辈指教。
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2020-1-16 14:41:51 | 显示全部楼层
因为插值后的降水会出现小于0的情况,实际上降水是不可能小于0 的。
因此可以把小于0的所有的格点都赋值为0,也包括缺省值-999
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

 楼主| 发表于 2020-1-16 15:09:14 | 显示全部楼层
但是前辈,要是这样的话,我画等值线的话,不会吧0这些值也给串起来了吧
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

发表于 2020-1-16 15:14:08 | 显示全部楼层
渣渣顼 发表于 2020-1-16 15:09
但是前辈,要是这样的话,我画等值线的话,不会吧0这些值也给串起来了吧

不会的啊 实在不行的话,你降水量的等值线可以从0.1开始画起啊。毕竟实际观测的降水量最小的也是0.1
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

 楼主| 发表于 2020-1-16 15:25:10 | 显示全部楼层
for i in range(256):
    for j in range(144):
        if rain[i,j]==-999:C:\Users\Administrator\Desktop\11.png
            rain[i,j]=0
前辈,你看是这样吗?
但是我画出来是这个奇怪的样子
11.png
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

 楼主| 发表于 2020-1-16 15:28:50 | 显示全部楼层
渣渣顼 发表于 2020-1-16 15:25
for i in range(256):
    for j in range(144):
        if rain==-999:

还是说我的代码其他地方有问题?我是第一次用python绘制气象图片,可能有点坑
这是我完整代码
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.cm import get_cmap
import cartopy.crs as crs
from cartopy.feature import NaturalEarthFeature
f=open(r'C:\Users\Administrator\Desktop\SURF_CLI_CHN_PRE_DAY_GRID_0.25-20190811.grd','r')
a=np.fromfile(f,dtype=np.float32)
f.close()
b=a.reshape(2,256,144)
rain=b[0,:,:]
for i in range(256):
    for j in range(144):
        if rain[i,j]==-999:
            rain[i,j]=0

lon=72.125+0.25*np.arange(256)
lat=18.125+0.25*np.arange(144)
lat, lon = np.meshgrid(lat, lon)
fig = plt.figure(figsize=(12,6))
states = NaturalEarthFeature(category="cultural", scale="10m",
                                 facecolor="none",
                                 name="admin_1_states_provinces_shp")
ax = plt.axes(projection=crs.PlateCarree())
ax.add_feature(states, linewidth=.5, edgecolor="black")

ax.coastlines()
ax.gridlines(linestyle='--')
plt.contour(lon, lat, rain, 5, colors="black",transform=crs.PlateCarree())
plt.show()
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

发表于 2020-1-16 15:34:35 | 显示全部楼层
pre[pre == -999.0] = np.nan
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

发表于 2020-1-16 16:17:55 | 显示全部楼层
先插值 再把格点中的小于0的赋值给0.
olon,olat = np.meshgrid(olon,olat)    #坐标网格化!!!
func = Rbf(lon, lat, rain,function='cubic')    #插值函数用Rbf方法
rain = func(olon, olat)    #插值
rain_new[rain_new <0]=0.#判断,把格点值小于0的 都赋值给0
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

发表于 2020-1-16 16:40:18 | 显示全部楼层
本帖最后由 好久不见 于 2020-1-16 17:22 编辑

应该是数据读取的时候出了问题或者是坐标设置错了,楼主试试把lat, lon = np.meshgrid(lat, lon) 改成 lon, lat = np.meshgrid(lon, lat),还不对的话应该就是读取的时候没有按照正确维度读进来……
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

 楼主| 发表于 2020-1-18 11:03:28 | 显示全部楼层
好久不见 发表于 2020-1-16 16:40
应该是数据读取的时候出了问题或者是坐标设置错了,楼主试试把lat, lon = np.meshgrid(lat, lon) 改成 lon, ...

谢谢前辈,应该是我的数据弄反了,已经改正了
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册 新浪微博登陆

本版积分规则

Copyright ©2011-2014 bbs.06climate.com All Rights Reserved.  Powered by Discuz! (京ICP-10201084)

本站信息均由会员发表,不代表气象家园立场,禁止在本站发表与国家法律相抵触言论

快速回复 返回顶部 返回列表