将数据排列成 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")
我在 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")