记录错误:python二维插值之后与原图相差甚远

为什么我要插值?因为我的日值场和气候态场的网格间隔不一样(前者是0.75°×0.75°,后者是0.25°×0.25°),没办法相减,所以想把日值场插值到气候态场。
如何插值?参考了钦天监摸鱼记事的文章:https://www.jianshu.com/p/ff0888f7add8
遇到的问题?插值前后的图对不上。
解决过程: 画了一下全球的图(我原来只画了我关注的区域),发现是插值后变量的南北纬反了。

反思: 处理数据、计算、画图的代码都找不出问题,可以试试画出全球的图找问题。某女士画500hPa高度图画不出台风也是因为这个(弱智)问题。

代码

插值代码:

# -*- coding: utf-8 -*-
"""
Created on Sun Apr  3 09:20:23 2022

@author: Onefire Jung
"""

import xarray as xr 
import numpy as np 
from scipy.interpolate import griddata #插值函数

import matplotlib.pyplot as plt 
import cartopy.crs as ccrs                                               
import cartopy.feature as cf                                             
from cartopy.mpl.ticker import LongitudeFormatter,LatitudeFormatter
import cartopy.mpl.ticker as cticker
from matplotlib.ticker import MaxNLocator

#c场为气候场;d场为日值场
filec = xr.open_dataset(r'.\part2\hgt1981_2010_whole.nc')
filed = xr.open_dataset(r'.\part2\hgt_2012.nc')

#挑出需要的变量数据:气候场中跳出xxxhPa做时间平均,日值场中挑
hgt_July = np.average(filec.z[:,1,:,:],axis = 0)
hgt_d = filed.z.loc["2012-07-21"]

#c场的经纬度(0.25×0.25)
lon = filec.longitude
lat = filec.latitude

#d场的原经、纬度(0.75×0.75)
lons = filed.longitude.values 
lats = filed.latitude.values


############           插值            ##########

#构造point(被插场的原网格)
x = np.tile(lons,lats.shape[0]) #重复完整的lons n次
y = np.repeat(lats,lons.shape[0]) #重复lats中每个元素m次
point = np.stack([x,y],axis = -1) #拼接

#构造points(目标网格):官方建议插值使用numpy的mgrid导入网格
lon1,lon2,lat1,lat2 = np.min(lon),np.max(lon),np.min(lat),np.max(lat)
step = 0.25
lat_new1, lon_new1 = np.mgrid[-90.0:90.0+0.25:0.25,0.0:359.75+0.25:0.25]
lon_new= lon_new1.ravel() #展成一维
lat_new= lat_new1.ravel() #展成一维
points= np.stack([lon_new,lat_new],axis = -1)

#把values转成一维(插值函数要求values是一维的)
hgt_d_1dimon = hgt_d.values.ravel()

#插值函数,插完得到的是一维数组,还需要转成二维
result =griddata(point,hgt_d_1dimon,points,method='cubic',fill_value=0,rescale=True) 
hgt_d_resize = result.reshape((721, 1440)) #转成二维

#单位华为位势什米
hgt_July = hgt_July/100.
hgt_d_resize = hgt_d_resize /100.
#异常场
hgt_a = hgt_d_resize - hgt_July

'''
7月的气候场为:hgt_July(全域)
721当天:hgt_d_resize(全域)

'''


############           画图           ##########
plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签

fig = plt.figure(dpi=200)
ax1 = fig.add_subplot(1,1,1,projection=ccrs.PlateCarree())

# x,y是横纵坐标的索引,左闭右开
x1,x2 = 240,601
y1,y2 = 160,321 
leftlon, rightlon, lowerlat, upperlat = (60,150,10,50)
#mycrs = ccrs.PlateCarree(central_longitude=180)
mycrs = ccrs.PlateCarree()
ax1.set_global() #使得轴域(Axes即两条坐标轴围城的区域)适应地图的大小
ax1.coastlines() #画出海岸线
ax1.set_extent([leftlon, rightlon, lowerlat, upperlat], crs=mycrs)
ax1.set_xticks(np.arange(leftlon,rightlon+10,10), crs=mycrs)
ax1.set_yticks(np.arange(lowerlat,upperlat+10,10), crs= mycrs)
# # #使横纵向坐标含WESN
lon_formatter = cticker.LongitudeFormatter()
lat_formatter = cticker.LatitudeFormatter()
ax1.xaxis.set_major_formatter(lon_formatter)
ax1.yaxis.set_major_formatter(lat_formatter)

ax1.set_title('(a)插值过的day',loc='left',fontsize = 14)
# C = plt.contour(lon,lat,hgt_d_resize/100.,colors='black',transform=ccrs.PlateCarree()) #生成等值线图
# plt.clabel(C,inline=2,fmt='%1.0f',fontsize=10)
# plt.contourf(lon[240:601],lat[0:321],hgt_d_resize[0:321,240:601]., cmap='RdBu',levels = np.arange(520,650,10),transform=mycrs)
plt.contourf(lon[240:601],lat[160:321],hgt_d_resize[160:321,240:601], cmap='RdBu',levels = 20,transform=mycrs)
plt.colorbar(shrink=1,orientation = 'horizontal',pad = 0.1)
plt.show()

画原图的代码

···# -*- coding: utf-8 -*-
"""
Created on Sun Apr  3 12:06:20 2022

@author: Onefire Jung
"""
import xarray as xr 
import numpy as np 
from scipy.interpolate import griddata #插值函数

import matplotlib.pyplot as plt 
import cartopy.crs as ccrs                                               
import cartopy.feature as cf                                             
from cartopy.mpl.ticker import LongitudeFormatter,LatitudeFormatter
import cartopy.mpl.ticker as cticker
from matplotlib.ticker import MaxNLocator

#c场为气候场;d场为日值场
filed = xr.open_dataset(r'.\part2\hgt_2012.nc')
lon = filed.longitude
lat = filed.latitude

#挑出需要的变量数据:气候场中跳出xxxhPa做时间平均,日值场中挑

hgt_d = filed.z.loc["2012-07-21"].values/100.0
plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签

fig = plt.figure(dpi=200)
ax1 = fig.add_subplot(1,1,1,projection=ccrs.PlateCarree())

# x,y是横纵坐标的索引,左闭右开
leftlon, rightlon, lowerlat, upperlat = (60,150,10,50)
#mycrs = ccrs.PlateCarree(central_longitude=180)
mycrs = ccrs.PlateCarree()
ax1.set_global() #使得轴域(Axes即两条坐标轴围城的区域)适应地图的大小
ax1.coastlines() #画出海岸线
ax1.set_extent([leftlon, rightlon, lowerlat, upperlat], crs=mycrs)
ax1.set_xticks(np.arange(leftlon,rightlon+10,10), crs=mycrs)
ax1.set_yticks(np.arange(lowerlat,upperlat+10,10), crs= mycrs)
# # #使横纵向坐标含WESN
lon_formatter = cticker.LongitudeFormatter()
lat_formatter = cticker.LatitudeFormatter()
ax1.xaxis.set_major_formatter(lon_formatter)
ax1.yaxis.set_major_formatter(lat_formatter)

ax1.set_title('(a)没插值的',loc='left',fontsize = 14)
# C = plt.contour(lon,lat,hgt_d_resize/100.,colors='black',transform=ccrs.PlateCarree()) #生成等值线图
# plt.clabel(C,inline=2,fmt='%1.0f',fontsize=10)
# plt.contourf(lon[240:601],lat[0:321],hgt_d_resize[0:321,240:601]., cmap='RdBu',levels = np.arange(520,650,10),transform=mycrs)
plt.contourf(lon[81:201],lat[41:108],hgt_d[41:108,81:201], cmap='RdBu',levels = 20,transform=mycrs)
plt.colorbar(shrink=1,orientation = 'horizontal',pad = 0.1)

plt.show()

图片对比

插值后的图.png

没插值的图.png

这显然就插得太不对头了!后来画了全球图才发现是因为插值后南北纬反了!
我们现在把南北纬度调回来,就好了!

hgt_d_resize = hgt_d_resize[::-1,:]
对了.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,544评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,430评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,764评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,193评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,216评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,182评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,063评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,917评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,329评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,543评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,722评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,425评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,019评论 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,671评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,825评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,729评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,614评论 2 353

推荐阅读更多精彩内容