Как построить pcolormesh для определенных координатных точек вместо сетки из одномерных значений широты

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

Я видел повсюду сообщения о преобразовании одномерных массивов широты и долготы с использованием сетки, но в этом случае это не сработает, потому что это сами конкретные координаты. Я попытался отсортировать их по восходящей долготе и / или широте и / или обоим. Затем я попытался сместить координаты, преобразовав их в множители их общей длины, но тщетно.

Данные:

    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()

person MNK    schedule 05.05.2019    source источник
comment
Вам нужно каким-то образом перенести данные в двумерную сетку, чтобы использовать pcolormesh, или выполнить триангуляцию с помощью tripcolor. Чтобы сопоставить данные, просмотрите docs.scipy. org / doc / scipy / reference / generated / или ссылки в нем.   -  person Jody Klymak    schedule 06.05.2019


Ответы (1)


Вы имеете дело с неструктурированными данными. Вы можете определить сетку и интерполировать данные в эту сетку, но в на мой взгляд, более аккуратный способ - использовать 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)
person Patol75    schedule 06.05.2019
comment
Спасибо за ваше предложение. К сожалению, это не сработало. Эти странные области все еще заполняются линиями. @ Patol75 - person MNK; 06.05.2019
comment
Было бы полезно, если бы вы действительно показали рисунок, который нанесен на график. - person Patol75; 07.05.2019