如何绘制特定坐标点的pcolormesh而不是一维纬度值的网格

时间:2019-05-05 22:37:46

标签: python matplotlib matplotlib-basemap cartopy

我有一个数据框,其中包含三列:纬度经度变量。其中大约有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()

1 个答案:

答案 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)