Как построить pcolormesh для конкретных координатных точек вместо сетки из 1D значений долготы - PullRequest
0 голосов
/ 06 мая 2019

У меня есть фрейм данных, который содержит три столбца: Широта , Долгота и Переменная .В нем примерно 100 тысяч строк.Мне нужно построить колориметрическую сетку этих данных, которая показывает странные линии и области.

Я видел сообщения повсюду, в которых конвертировались одномерные массивы с помощью 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 голосов
/ 06 мая 2019

Вы имеете дело с неструктурированными данными. Возможно, вы захотите определить сетку и интерполировать данные в эту сетку, но, на мой взгляд, более аккуратным способом является использование tricontourf . Эта функция использует триангуляцию , чтобы ваши исходные данные не изменялись перед построением графика. Полезными ключевыми словами являются, например, сглаживание, уровни, расширение, 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)
...