基于 pandas 数据框中的值的彩色地图网格

colour map grids based on value in pandas dataframe

我想根据感兴趣的值用颜色填充网格地图。样本数据在这里:

import pandas as pd

df = pd.DataFrame()
df['lon'] = [100,105,110,115,120,125,130]
df['lat'] = [38,40,42,44,46,48,50]
df['value'] = [1,2,3,4,5,6,7]

具体来说,是否可以用 Cartopy 做到这一点?我发现了一个类似的问题here:

我自己试过:

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import cartopy.crs as ccrs

lon, lat = np.meshgrid(df['lon'], df['lat'])

fig = plt.figure(figsize=[15,15])
ax = plt.axes(projection=ccrs.PlateCarree())
ax.pcolormesh(lon,lat,df['variable'],latlon=True,cmap='jet')

plt.show()

错误在 ax.pcolormesh(...),它说 "not enough values to unpack (expected 2, got 1)"

非常感谢您的帮助。

对于离散数据,您可以为每个点创建矩形补丁。这是您的示例数据集的可能解决方案。每行数据(纬度、经度、值)用于创建一个矩形补丁。 value 通过除以 max(value) 进行归一化,以启用使用颜色图为补丁着色。

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import cartopy.crs as ccrs
import matplotlib.patches as mpatches

def make_rect(clon, clat, dlon, dlat):
    lon_min = clon - dlon/2.
    lat_min = clat - dlat/2.
    lon_max = clon + dlon/2.
    lat_max = clat + dlat/2.
    # clockwise from LL
    #lons = [lon_min, lon_min, lon_max, lon_max, lon_min]
    #lats = [lat_min, lat_max, lat_max, lat_min, lat_min]
    ll = [lon_min,lat_min]
    ul = [lon_min,lat_max]
    ur = [lon_max,lat_max]
    lr = [lon_max,lat_min]
    return [ll, ul, ur, lr, ll]

df = pd.DataFrame()
df['lon'] = [100,105,110,115,120,125,130]
df['lat'] = [38,40,42,44,46,48,50]
df['value'] = [1,2,3,4,5,6,7]   # not suffice for meshgrid plot

# The colormap to use.
cm = plt.cm.get_cmap('jet')

fig = plt.figure(figsize=[8,6])
ax = plt.axes(projection=ccrs.PlateCarree(), extent=[95, 134, 35, 52])

# plot the red dots using the available data
# comment out if not needed
ax.plot(df['lon'], df['lat'], 'ro')

# plot rectangular patches at the data points
dlon, dlat = 5, 2  #spacings between data points
for lon1, lat1, val1 in zip(df['lon'], df['lat'], df['value']):
    pcorners = make_rect(lon1, lat1, dlon, dlat)
    poly = mpatches.Polygon(pcorners, ec='gray', fill=True, lw=0.25, \
           fc=cm(val1 / max(df['value'])), transform=ccrs.PlateCarree())
    ax.add_patch(poly)       

ax.gridlines(draw_labels=True)
plt.show()

输出图: