我有一个数据框,其中包含三列:纬度,经度和变量。其中大约有10万行。我需要绘制此数据的色网格,以显示奇怪的线条和区域。
我到处都看到过使用Meshgrid转换一维纬度数组的文章,但是在这种情况下不起作用,因为它们本身就是特定的坐标。我试图将它们按升序lon和/或lat和/或两者进行排序。然后,我尝试移动坐标,将其重塑为总长度的因子,但徒劳无功。
数据:
Longitude = [-10, -40, 34, 12, 67, ...] # 138627 elements
Latitude = [ 23, -89, 67, -25, 92, ...] # same
Variable = [ 1, 2, 3, 4, 5, ...] # same
代码:
import cartopy, glob, warnings, os, matplotlib.pyplot as plt
import numpy as np, cartopy.crs as ccrs
from netCDF4 import Dataset as netcdf_dataset
from cartopy import config
from mpl_toolkits.basemap import Basemap
warnings.simplefilter('ignore')
# CARTOPY
ax = plt.axes(projection=ccrs.PlateCarree())
plt.pcolormesh(Longitude, Latitude, Variable)
ax.coastlines()
plt.show()
# BASEMAP
m = Basemap(projection='cyl', llcrnrlat=-90, llcrnrlon=-180, rcrnrlat=90, urcrnrlon=180)
#TRY 1
new_coor = sorted([(i,j) for i,j in zip(Longitude, Latitude)], key=lambda x: x[0])
shape = (3,46209) #len(Latitude) = 138627
Longitude = np.asarray([i[0] for i in new_coor]).reshape(shape)
Latitude = np.asarray([i[1] for i in new_coor]).reshape(shape)
xi, yi = m(Longitude, Latitude)
cs = m.pcolor(xi, yi, np.squeeze(Variable)) #tried *pcolormesh* also
# tried *m.shifting()* and *lat_lon = True* also
m.drawcoastlines()
m.drawcountries()
cbar = m.colorbar(cs, location='bottom', pad="10%")
plt.show()
答案 0 :(得分:0)
您正在处理非结构化数据。您可能想定义一个grid并将数据interpolate放到该网格上,但是我认为,更巧妙的方法是使用tricontourf。此函数使用triangulation,以便在绘制原始数据之前不会对其进行修改。有用的关键字是例如抗锯齿,级别,扩展,cmap。
import cartopy.crs as ccrs
import matplotlib.pyplot as plt
from matplotlib.tri import Triangulation
triMesh = Triangulation(Longitude, Latitude)
fig, ax = plt.subplots(nrows=1, ncols=1, num=0,
subplot_kw={'projection': ccrs.PlateCarree()},
figsize=(16, 8))
ctrf = ax.tricontourf(triMesh, Variable)
cbar = fig.colorbar(ctrf)