Я хотел бы наложить дрожащий график направления ветра на базовую карту в моем блокноте jupyter.У меня есть пандас dataframe, который включает в себя столбцы: |Широта |Долгота |True Wind Inferred |
Я уже использовал геопанды для создания геоданных и построения данных трека gps на базовой карте osm, используя контекстно (код ниже).Я также смог определить широту и долготу, чтобы получить среднее значение True Wind Inferred (направление ветра) для «прямоугольника» на карте.Тем не менее, я не нашел примеров того, как построить в коробках колчанный сюжет с изображением Истинного Ветра.Пока что я построил только точечную диаграмму, но цветная карта плохо отображает данные о направлении.
Импорт:
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
# plot inline graphics
%pylab inline
import os.path
from shapely.geometry import Point
import geopandas as gpd
import contextily as ctx
Пример кадра данных:
df[['Latitude', 'Longitude', 'True Wind Inferred', 'coords']].head()
Latitude Longitude True Wind Inferred coords
0 -31.991899 115.848825 173.835559 POINT (115.848825 -31.991899)
1 -31.992036 115.848873 182.620880 POINT (115.848873 -31.992036)
2 -31.992181 115.848895 192.140276 POINT (115.848895 -31.992181)
3 -31.992308 115.848832 206.655730 POINT (115.848832 -31.992308)
4 -31.992430 115.848784 218.656646 POINT (115.848784 -31.99243)
Объединение кадра данных:
step = 0.005
to_bin = lambda x: np.floor(x / step) * step
dfLocBin['latbin'] = df['Latitude'].map(to_bin)
dfLocBin['lonbin'] = df['Latitude'].map(to_bin)
dfLocBin = df.groupby(['latbin', 'lonbin'])[['True Wind Inferred']].mean()
dfLocBin.reset_index(inplace=True)
dfLocBin['coords'] = list(zip(dfLocBin['lonbin'], dfLocBin['latbin']))
dfLocBin['coords'] = dfLocBin['coords'].apply(Point)
dfLocBin.head()
latbin lonbin True Wind Inferred coords
0 -32.015 115.790 223.149075 POINT (115.79 -32.015)
1 -32.015 115.795 222.242870 POINT (115.795 -32.015)
2 -32.015 115.800 223.710092 POINT (115.8 -32.015)
3 -32.015 115.805 225.887096 POINT (115.805 -32.015)
4 -32.015 115.810 225.298059 POINT (115.81 -32.015)
И построение графика:
def add_basemap(ax, zoom, url='http://tile.stamen.com/terrain/tileZ/tileX/tileY.png'):
xmin, xmax, ymin, ymax = ax.axis()
basemap, extent = ctx.bounds2img(xmin, ymin, xmax, ymax, zoom=zoom, url=url)
ax.imshow(basemap, extent=extent, interpolation='bilinear')
# restore original x/y limits
ax.axis((xmin, xmax, ymin, ymax))
geo_df = gpd.GeoDataFrame(
dfLocBin, crs ={'init': 'epsg:4326'},
geometry = dfLocBin['coords']
).to_crs(epsg=3857)
ax = geo_df.plot(
figsize= (20, 20),
alpha = 1,
c=dfLocBin['True Wind Inferred']
)
add_basemap(ax, zoom=15, url=ctx.tile_providers.ST_TONER)
ax.set_axis_off()
plt.title('Binned True Wind Direction')
plt.show()
точечный график
Я хотел бы изменить тип графика сразбросайте цвета на колчане со стрелками, указывающими направление ветра по компасу.