将数据排列成 lat/lon 个值的网格

arrange data into a meshgrid of lat/lon values

我在 csv 文件中有三列 'Lat'、'Lon' 和 'values',其中包含 158 个网格的数据:

我想在空间图中绘制 'values',每个 lat/lon 对都使用 pcolormesh 函数。我正在使用其中一个在线页面中建议的以下代码:

import numpy as np
import cartopy
import cartopy.crs as ccrs
import cartopy.feature as cfeature
import matplotlib.pyplot as plt
import matplotlib.ticker as mticker
import pandas as pd
import random
   
lat = np.array(df_lat_lon['Lat'])
lon = np.array(df_lat_lon['Lon'])
x, y = np.meshgrid(lon, lat)
    
 
z = np.array_split(df_lat_lon['values'].values.tolist(), 158)
    
    
fig = plt.figure(figsize=[16, 16])
ax = plt.subplot(1, 1, 1, projection=ccrs.PlateCarree())
    
ax.set_extent([19.5, 24, 80, 85], crs=ccrs.PlateCarree())
    
ax.add_feature(cfeature.LAND, zorder=1, facecolor='0.25')
ax.add_feature(cartopy.feature.OCEAN, zorder=4)
    
ax.pcolormesh(x, y, z, transform=ccrs.PlateCarree(), zorder=3)
    
plt.show()

看来我只有 158 个 (x,y) 对的 158 个 z 值。我不知道如何将 'values' 的单列重塑为 158x158 矩阵,以便 meshgrid 准备空间图。我收到以下错误:

nrows, ncols = C.shape

ValueError: not enough values to unpack (expected 2, got 1)

感谢任何帮助。提前致谢。

预期的图像如下:

更新答案

好的...在看到您要创建的示例地图后,我认为插值不是您要搜索的...您只是面临绘制非矩形数据集的问题。 ...

不确定如何在纯 cartopy 中快速执行此操作,但这又是我创建 EOmaps 的原因之一......它不需要矩形数据集,它只处理一维向量坐标和数据值。

以下是创建与您作为示例添加的情节类似的情节的方法:

import pandas as pd

data = pd.DataFrame(dict(
        lat = [20, 20, 20, 20, 20.25, 20.25, 20.25, 20.25, 20.25, 20.25, 20.25, 20.5, 20.5, 20.5],
        lon = [81.5, 81.75, 82, 82.25, 81, 81.25, 81.5, 81.75, 82, 82.25, 82.5, 80.5, 80.75, 81],
        values = [5,8,2,0,6,1,5,6,8,3,4,1,4,4]))
from eomaps import Maps

m = Maps()
m.set_plot_specs(crs=4326)
m.set_data(data=data, xcoord="lon", ycoord="lat", parameter="values")
m.set_shape.rectangles(radius=0.125)
m.plot_map()

原回答


在使用 pcolormesh 将其可视化之前,您需要使用诸如 scipy's interp2d 之类的一些网格插值将数据插入到网格中...

或者,您可以使用某种三角测量来处理空间插值...



... 顺便提一下 :-) 我设计了一个(基于 cartopy 的)包(>> EOmaps),它有助于从 1D 数据创建地图......它也可以做一些三角测量......检查一下!

from eomaps import Maps
import pandas as pd
data = pd.DataFrame(dict(lon=[11,12,13,14,15,16,17,18,19,20], 
                         lat=[11,12,13,14,15,11,12,13,14,15],
                         z=[1,2,3,4,5,6,7,8,9,10]))

m = Maps()
m.set_data(data=data, crs=4326)

# plot a triangulation of the data
m.set_shape.delaunay_triangulation(masked=False)
m.plot_map(colorbar=False)

# indicate just the triangles used in the delauney triangulation
m.set_shape.delaunay_triangulation(masked=False, flat=True)
m.plot_map(colorbar=False, fc="none", ec="k", lw=0.5, ls=(1, (10, 10)))

# indicate the data-points as ellipses
m.set_shape.ellipses(radius=.15)
m.plot_map(colorbar=False, ec="k")