Introduction
Bokeh offre un cadre puissant pour créer des visualisations de données interactives. Grâce à l'importation de kits d'outils géographiques comme GeoPandas, Bokeh permet de cartographier des points sur un canevas avec une interface simple et efficace.
En supposant que vous ayez installé les packages nécessaires (Bokeh, Pandas et Geopandas), voici un guide étape par étape pour ajouter des points définis par une longitude et une latitude sur une carte en utilisant Bokeh :
Création d'une carte avec Bokeh
Pour commencer, créons une carte en utilisant Bokeh. Il existe plusieurs approches et cartes disponibles. Pour cet exemple, utilisons la carte "OpenStreetMap Mapnik".
from bokeh.plotting import figure, show, output_file
p = figure(x_range=(-2000000, 6000000), y_range=(4000000, 7000000),
x_axis_type="mercator", y_axis_type="mercator")
p.add_tile("OpenStreetMap Mapnik")
p.grid.visible = False
show(p)
Le graphique ci-dessus générera la visualisation suivante :
Pour pouvoir tracer avec précision des points sur une carte, il est crucial de déterminer le système de projection utilisé. Dans ce cas, notre carte utilise la projection Mercator. Pour tracer nos points correctement, nous devons convertir les longitudes et latitudes dans le système de coordonnées approprié. Un outil très efficace pour y parvenir en Python est un dataframe geopandas. Dans l'exemple suivant, nous allons vous montrer comment stocker vos données dans un dataframe geopandas et convertir le système de coordonnées pour finalement tracer nos points.
Création d'une collection de coordonnées en utilisant des valeurs de latitude et de longitude.
Par exemple, nous pouvons générer un ensemble de données qui inclut les coordonnées (latitude et longitude) de différentes villes :
data = {'city_name':['Paris','London','Moscow', 'Istanbul'],
'longitude':[2.3522,-0.1276,37.6173,28.9784],
'latitude':[48.8566,51.5072,55.7558,41.0082]}
Création d'un dataframe geopandas.
Nous pouvons alors stocker nos données dans une DataFrame pandas :
import pandas as pd
df = pd.DataFrame(data)
et convertir notre Dataframe en Geodataframe
import geopandas
gdf = geopandas.GeoDataFrame(
df,
geometry=geopandas.points_from_xy(df.longitude, df.latitude),
crs="EPSG:4326"
)
Pour déterminer le système de coordonnées CRS associé à notre dataframe, nous pouvons exécuter la commande suivante :
print( gdf.crs )
Le code présenté ici ne correspond pas à Mercator.
EPSG:4326
Afin de mettre nos données dans la projection Mercator, nous pouvons faire :
gdf = gdf.to_crs("epsg:3857") # Mercator-projection
Enfin, notre ensemble de données s'est transformé dans le format suivant :
city_name longitude latitude geometry
0 Paris 2.3522 48.8566 POINT (261845.706 6250564.350)
1 London -0.1276 51.5072 POINT (-14204.367 6711506.705)
2 Moscow 37.6173 55.7558 POINT (4187538.681 7509955.142)
3 Istanbul 28.9784 41.0082 POINT (3225860.732 5013551.237)
À la dernière étape, nous pouvons extraire les coordonnées dans la projection Mercator qui correspondent aux longitudes et latitudes données:
gdf['longitude_x'] = gdf['geometry'].x
gdf['latitude_y'] = gdf['geometry'].y
Maintenant, le geodataframe a deux nouvelles colonnes qui seront utilisées pour tracer nos points :
city_name longitude latitude geometry \
0 Paris 2.3522 48.8566 POINT (261845.706 6250564.350)
1 London -0.1276 51.5072 POINT (-14204.367 6711506.705)
2 Moscow 37.6173 55.7558 POINT (4187538.681 7509955.142)
3 Istanbul 28.9784 41.0082 POINT (3225860.732 5013551.237)
longitude_x latitude_y
0 2.618457e+05 6.250564e+06
1 -1.420437e+04 6.711507e+06
2 4.187539e+06 7.509955e+06
3 3.225861e+06 5.013551e+06
Création d'une "bokeh ColumnDataSource"
Nous pouvons maintenant stocker nos données dans un Bokeh ColumnDataSource. Pour cela, nous pouvons utiliser une dataframe pandas. En conséquence, nous devons convertir notre dataframe geopandas mentionné précédemment et supprimer la colonne "geometry" car Bokeh ne reconnaît pas cette colonne.
df_new = pd.DataFrame(gdf.drop(columns='geometry'))
Maintenant, nous pouvons créer une bokeh ColumnDataSource.
from bokeh.models import ColumnDataSource
source = ColumnDataSource(df_new)
Traçer des points sur une carte avec Bokeh
Maintenant, nous pouvons visualiser nos données sur la carte en traçant les points à l'aide de la fonction p.circle().
from bokeh.plotting import figure, show, output_file
p = figure(x_range=(-2000000, 6000000), y_range=(4000000, 7000000),
x_axis_type="mercator", y_axis_type="mercator")
p.add_tile("OpenStreetMap Mapnik")
p.circle(x='longitude_x', y='latitude_y', size=15, alpha=0.7, source=source)
p.grid.visible = False
show(p)
Cela créera des cercles d'une taille de 15, une valeur alpha de 0.7 et la source de données spécifiée comme étant 'source'.
Références
Liens | Site |
---|---|
tile_demo | docs.bokeh.org |
Mapping geo data | docs.bokeh.org |
circle | docs.bokeh.org |