Переназначить позиции на широты и долготы, определенные сеткой - PullRequest
0 голосов
/ 24 октября 2019

У меня есть некоторые данные об уровнях озона на некоторых участках мониторинга в Великобритании, с указанием широты и долготы каждого участка, например:

df = pd.DataFrame([[33.      , 52.411563, -1.560228],
       [45.      , 52.437165, -1.829999],
       [31.      , 52.47609 , -1.875024],
       [53.      , 50.5976  , -3.71651 ],
       [39.      , 50.37167 , -4.142361],
       [41.      , 50.725083, -3.532465],
       [69.      , 51.05625 , -2.68345 ],
       [38.      , 51.462839, -2.584482],
       [56.      , 50.73957 , -1.826744]],columns = ['values','lat','lon'])

Я хотел бы представить эти точки как квадраты сетки, закрашенные их среднимзначение для точек, которые лежат в пределах одного и того же поля сетки, используя официальную сетку - 0,25x0,3125 км, широты и долготы которой определяются следующим образом:

grid = {'lon':np.linspace(-15.00,40,177),
            'lat':np.linspace(32.75,61.25,115)} #should define the grid squares for the map

Я попытался просмотреть столбцы широты и долготы,переназначение каждого значения его ближайшей лат-лонской паре. Это выглядит как работа.

for i, [time, val, lat, lon] in DEFRAO3.iterrows():
    pos_lat = bisect_left(nested_grid['lat'],lat)
    new_lat = nested_grid['lat'][pos_lat]
    pos_lon = bisect_left(nested_grid['lon'],lon)
    new_lon = nested_grid['lon'][pos_lat]

    DEFRAO3.set_value(i, 'latitude', new_lat)
    DEFRAO3.set_value(i, 'longitude', new_lon)
DEFRAO3

Дает:

grid-adjusted measurement locations

Затем, усреднение для позиций с одинаковыми (широта, долгота):

newDEFRA = DEFRAO3.groupby(['latitude','longitude'], as_index=False).mean()

Но когда я строю это, все мои точки находятся вдоль одной диагональной линии.

All points are along the same diagonal line, which is not correct

1 Ответ

0 голосов
/ 24 октября 2019

Библиотека seaborn содержит некоторые полезные функции построения графиков для этих типов графиков.

Следующий код создаст график, который, я думаю, вы ищете:

import seaborn as sns
import pandas as pd

df = ...

# you might want to round lat/lon as appropriate before grouping

df2 = df.groupby(["lat", "lon"]).mean()
df2 = df2.unstack()  # Turns your long dataframe into a 2D dataframe.
df2 = df2.sort_index(ascending=False)  # Highest latitude first

sns.heatmap(df2, cmap="viridis", cbar="right")
plt.show()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...