Python温度插值

Python温度插值,python,interpolation,temperature,cartopy,metpy,Python,Interpolation,Temperature,Cartopy,Metpy,我目前正尝试使用本网站()上提供的代码,在Jupyter笔记本上创建一幅台湾地图,并对数据进行线性插值 我的数据如下表所示: 17070123, lat, lon, tem C0A92, 25.27, 121.56, 29.3 C0AD0, 25.26, 121.49, 28.2 C0A94, 25.23, 121.64, 26.2 46691, 25.19, 121.52, 23.4 46690, 25.17, 121.44, 27.3 46693, 25.17, 121.54,

我目前正尝试使用本网站()上提供的代码,在Jupyter笔记本上创建一幅台湾地图,并对数据进行线性插值

我的数据如下表所示:

17070123, lat, lon, tem

C0A92, 25.27, 121.56, 29.3

C0AD0, 25.26, 121.49, 28.2

C0A94, 25.23, 121.64, 26.2

46691, 25.19, 121.52, 23.4

46690, 25.17, 121.44, 27.3

46693, 25.17, 121.54, 22.5

C0AD1, 25.15, 121.4, 28.5

46694, 25.13, 121.73, 28.6

C0A95, 25.13, 121.92, -999

C0A9B, 25.12, 121.51, 26.8

C0A9C, 25.12, 121.53, 28.3

C0A66, 25.11, 121.79, 27.8

C0A98, 25.11, 121.46, 29.6

C0A68, 25.09, 121.43, -999
#17070123   lat lon T

C0A92   25.27   121.56  29.3

C0AD0   25.26   121.49  28.2

C0A94   25.23   121.64  26.2

46691   25.19   121.52  23.4

46690   25.17   121.44  27.3

46693   25.17   121.54  22.5

C0AD1   25.15   121.4   28.5

46694   25.13   121.73  28.6

C0A95   25.13   121.92  -999

C0A9B   25.12   121.51  26.8

C0A9C   25.12   121.53  28.3

C0A66   25.11   121.79  27.8

C0A98   25.11   121.46  29.6

C0A68   25.09   121.43  -999
并且以这种形式:

17070123, lat, lon, tem

C0A92, 25.27, 121.56, 29.3

C0AD0, 25.26, 121.49, 28.2

C0A94, 25.23, 121.64, 26.2

46691, 25.19, 121.52, 23.4

46690, 25.17, 121.44, 27.3

46693, 25.17, 121.54, 22.5

C0AD1, 25.15, 121.4, 28.5

46694, 25.13, 121.73, 28.6

C0A95, 25.13, 121.92, -999

C0A9B, 25.12, 121.51, 26.8

C0A9C, 25.12, 121.53, 28.3

C0A66, 25.11, 121.79, 27.8

C0A98, 25.11, 121.46, 29.6

C0A68, 25.09, 121.43, -999
#17070123   lat lon T

C0A92   25.27   121.56  29.3

C0AD0   25.26   121.49  28.2

C0A94   25.23   121.64  26.2

46691   25.19   121.52  23.4

46690   25.17   121.44  27.3

46693   25.17   121.54  22.5

C0AD1   25.15   121.4   28.5

46694   25.13   121.73  28.6

C0A95   25.13   121.92  -999

C0A9B   25.12   121.51  26.8

C0A9C   25.12   121.53  28.3

C0A66   25.11   121.79  27.8

C0A98   25.11   121.46  29.6

C0A68   25.09   121.43  -999
我的代码如下所示:

# In[1]:

import cartopy
import cartopy.crs as ccrs
from matplotlib.colors import BoundaryNorm
import matplotlib.pyplot as plt
import numpy as np


# In[2]:

from metpy.cbook import get_test_data
from metpy.gridding.gridding_functions import (interpolate, 
remove_nan_observations,
                                           remove_repeat_coordinates)


# In[3]:

def basic_map(map_proj):
   """Make our basic default map for plotting"""
   fig = plt.figure(figsize=(15, 10))
   view = fig.add_axes([0, 0, 1, 1], projection=to_proj)
   view.set_extent([120.5, 122.5, 24.5, 25.5])
   view.add_feature(cartopy.feature.NaturalEarthFeature(category='cultural',

   name='admin_1_states_provinces_lakes',
                                                    scale='50m', 
facecolor='none'))
   view.add_feature(cartopy.feature.OCEAN)
   view.add_feature(cartopy.feature.COASTLINE)
   view.add_feature(cartopy.feature.BORDERS, linestyle=':')
   return view


# In[4]:

def station_test_data(variable_names, proj_from=None, proj_to=None):
    f = ('temp.txt')
    all_data = np.loadtxt(f, skiprows=0, delimiter='\t',
                      usecols=(0, 1, 2, 3),
                      dtype=np.dtype([('stid', '5S'), ('lat', 'f'), ('lon', 
                       'f'), ('T', 'f')]))
    all_stids = [s.decode('ascii') for s in all_data['stid']]
    data = np.concatenate([all_data[all_stids.index(site)].reshape(1, ) for 
site in all_stids])
    value = data[variable_names]
    lon = data['lon']
    lat = data['lat']
    if proj_from is not None and proj_to is not None:

        try:

            proj_points = proj_to.transform_points(proj_from, lon, lat)
            return proj_points[:, 0], proj_points[:, 1], value

        except Exception as e:

             print(e)
             return None

    return lon, lat, value


# In[5]:

from_proj = ccrs.Geodetic()
to_proj = ccrs.AlbersEqualArea(central_longitude=120.0000, 
central_latitude=25.0000)


# In[6]:

levels = list(range(20, 30, 1))
cmap = plt.get_cmap('magma')
norm = BoundaryNorm(levels, ncolors=cmap.N, clip=True)


# In[7]:

x, y, temp = station_test_data('T', from_proj, to_proj)


# In[8]:

x, y, temp = remove_nan_observations(x, y, temp)
x, y, temp = remove_repeat_coordinates(x, y, temp)


# In[9]:

gx, gy, img = interpolate(x, y, temp, interp_type='linear', hres=75000)
img = np.ma.masked_where(np.isnan(img), img)
view = basic_map(to_proj)
mmb = view.pcolormesh(gx, gy, img, cmap=cmap, norm=norm)
plt.colorbar(mmb, shrink=.4, pad=0, boundaries=levels)


# In[10]:

#Show map of TW with interpolated temps
plt.title("Interpolated Temperatures 17070100")
plt.show()
代码运行时没有错误,但我最终得到了一张空的台湾地图


我非常绝望,任何帮助都将不胜感激

无论何时向cartopy地图添加数据,务必记住定义坐标系。在本例中,由于您的数据是lat/lon格式的,因此我将从以下操作开始:

view.pcolormesh(..., transform=ccrs.PlateCarree())

您可能还对在中认真使用transform关键字感兴趣。

我不知道这个库,但看起来您是在映射本身之外表示颜色映射。代码
视图。设置范围([120.5122.5,24.5,25.5])
看起来像是在设置坐标。然而,地图的中心位于该框之外。。。