Afficher le code
import geopandas as gpd
import pandas as pd
import plotly.express as px
from IPython.display import display, HTML
import folium
from folium.features import GeoJsonTooltipPython : tableau, graphe, carte, inline code
Un premier bloc de code (chunk en anglais) est utilisé pour charger les librairies python qui seront utilisées dans les blocs de code suivant.
import geopandas as gpd
import pandas as pd
import plotly.express as px
from IPython.display import display, HTML
import folium
from folium.features import GeoJsonTooltipPython peut lire tous les formats, le geojson est un classique. La librairie pandas permet ensuite de manipuler ce fichier geojson, par exemple, sélectionner quelques colonnes et supprimer la colonne géométrie.
# Fonction pour lire un geojson
communes_mrn = gpd.read_file("data/communes_mrn.geojson")
# Utilisation du vocabulaire de pandas pour sélectionner quelques colonnes
communes_mrn_qqs_colonnes = communes_mrn.drop(columns='geometry')[['nom', 'population', 'surface_ha']]Et voici un affichage sous forme de tableau HTML.
# Affichage du tableau de donnée, oui c'est juste une ligne...
display(HTML(communes_mrn_qqs_colonnes.to_html()))| nom | population | surface_ha | |
|---|---|---|---|
| 0 | Elbeuf | 16087 | 1632 |
| 1 | Yainville | 1037 | 331 |
| 2 | Hénouville | 1366 | 1069 |
| 3 | Canteleu | 13807 | 1761 |
| 4 | Saint-Étienne-du-Rouvray | 28331 | 1825 |
| 5 | Petit-Couronne | 8732 | 1280 |
| 6 | Isneauville | 3601 | 820 |
| 7 | Jumièges | 1693 | 1875 |
| 8 | Saint-Jacques-sur-Darnétal | 3108 | 1671 |
| 9 | Fontaine-sous-Préaux | 558 | 352 |
| 10 | Maromme | 10845 | 401 |
| 11 | Freneuse | 960 | 318 |
| 12 | Bihorel | 8197 | 251 |
| 13 | Le Houlme | 4149 | 297 |
| 14 | Darnétal | 9780 | 493 |
| 15 | Orival | 881 | 955 |
| 16 | Tourville-la-Rivière | 2562 | 800 |
| 17 | Grand-Couronne | 9731 | 1691 |
| 18 | Les Authieux-sur-le-Port-Saint-Ouen | 1254 | 453 |
| 19 | Le Petit-Quevilly | 21997 | 435 |
| 20 | Bonsecours | 6466 | 376 |
| 21 | Caudebec-lès-Elbeuf | 9996 | 368 |
| 22 | Moulineaux | 922 | 349 |
| 23 | Notre-Dame-de-Bondeville | 6966 | 628 |
| 24 | Saint-Martin-du-Vivier | 1675 | 500 |
| 25 | Yville-sur-Seine | 437 | 825 |
| 26 | Cléon | 4919 | 647 |
| 27 | Saint-Léger-du-Bourg-Denis | 3617 | 281 |
| 28 | Épinay-sur-Duclair | 510 | 661 |
| 29 | Le Mesnil-sous-Jumièges | 617 | 684 |
| 30 | Berville-sur-Seine | 544 | 701 |
| 31 | Saint-Paër | 1307 | 1836 |
| 32 | Quévreville-la-Poterie | 1029 | 468 |
| 33 | Le Mesnil-Esnard | 7925 | 507 |
| 34 | Hautot-sur-Seine | 396 | 216 |
| 35 | Rouen | 114187 | 2138 |
| 36 | Malaunay | 6160 | 925 |
| 37 | La Londe | 2351 | 3098 |
| 38 | Ymare | 1182 | 403 |
| 39 | Saint-Pierre-de-Manneville | 885 | 1021 |
| 40 | Anneville-Ambourville | 1176 | 2033 |
| 41 | Sotteville-sous-le-Val | 749 | 527 |
| 42 | Déville-lès-Rouen | 10644 | 316 |
| 43 | Val-de-la-Haye | 718 | 1016 |
| 44 | Mont-Saint-Aignan | 19686 | 794 |
| 45 | Sotteville-lès-Rouen | 29071 | 744 |
| 46 | Belbeuf | 2242 | 651 |
| 47 | Saint-Aubin-lès-Elbeuf | 8428 | 579 |
| 48 | Roncherolles-sur-le-Vivier | 1212 | 535 |
| 49 | Bardouville | 622 | 861 |
| 50 | Saint-Pierre-lès-Elbeuf | 8251 | 636 |
| 51 | Franqueville-Saint-Pierre | 6099 | 856 |
| 52 | Gouy | 898 | 497 |
| 53 | Quevillon | 593 | 1123 |
| 54 | Houppeville | 2918 | 2080 |
| 55 | La Bouille | 707 | 127 |
| 56 | Saint-Aubin-Épinay | 1020 | 983 |
| 57 | Sahurs | 1212 | 1123 |
| 58 | Le Trait | 4831 | 1752 |
| 59 | Amfreville-la-Mi-Voie | 3299 | 394 |
| 60 | Montmain | 1397 | 604 |
| 61 | Saint-Aubin-Celloville | 1180 | 672 |
| 62 | Le Grand-Quevilly | 26034 | 1111 |
| 63 | Bois-Guillaume | 14378 | 885 |
| 64 | Saint-Pierre-de-Varengeville | 2290 | 1318 |
| 65 | Boos | 3990 | 1403 |
| 66 | Sainte-Marguerite-sur-Duclair | 2027 | 726 |
| 67 | La Neuville-Chant-d'Oisel | 2378 | 2183 |
| 68 | Oissel | 12266 | 2219 |
| 69 | Duclair | 4010 | 1002 |
| 70 | Saint-Martin-de-Boscherville | 1536 | 1291 |
Ensuite, il est assez simple de faire un graphe avec la grammaire de base de la librairie plotly.
fig = px.bar(
communes_mrn.sort_values(by='population', ascending=True),
y='nom', # Utiliser y pour les noms des communes
x='population', # Utiliser x pour les populations
title='Population des Communes de la MRN',
labels={'nom': 'Commune', 'population': 'Population'},
text='population',
orientation='h', # Graphique en barres horizontales
height=1200
)
fig# Ajout d'une carte leaflet
communes_mrn.explore()communes_mrn = communes_mrn.to_crs(epsg=4326)
# Créer une carte centrée sur le centroïde
m = folium.Map()
# se caler sur les limites de la couche
bbox = communes_mrn.total_bounds
minx, miny, maxx, maxy = bbox
bounds = [[miny, minx], [maxy, maxx]]
m.fit_bounds(bounds)
# Choroplèthe
chloropeth = folium.Choropleth(
geo_data=communes_mrn,
data=communes_mrn,
columns=["nom", "population"],
key_on="feature.properties.nom",
fill_color="Reds",
bins=10,
fill_opacity=0.7,
line_opacity=0.2,
legend_name="Population / commune",
highlight=True,
)
# Define the tooltips
tooltip = GeoJsonTooltip(
fields=['nom', 'population', "insee_com"],
aliases=['Commune: ', 'Population: ', "Code INSEE:"],
localize=True,
sticky=False,
smooth_factor=0,
labels=True,
style="""
background-color: #F0EFEF;
border: 2px solid black;
border-radius: 3px;
box-shadow: 3px;
font-size: 12px;
""",
max_width=750,
)
chloropeth.geojson.add_child(tooltip)
chloropeth.add_to(m)
# Ajouter un contrôle de couches
folium.LayerControl().add_to(m)
# Afficher la carte
m# Filtre
pop_rouen_df = communes_mrn[communes_mrn['insee_com'] == '76540'][['population']]
# et pour passer d'un dataframe à une simple valeur
pop_rouen_value = f"{pop_rouen_df.iloc[0, 0]:,}".replace(',', ' ')Rouen compte 114 187 habitants.
Dans cette phrase, le nombre d’habitants est issus directement du code grace à la syntaxe inline code.