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 GeoJsonTooltip
Python : 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 GeoJsonTooltip
Python 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
= gpd.read_file("data/communes_mrn.geojson")
communes_mrn
# Utilisation du vocabulaire de pandas pour sélectionner quelques colonnes
= communes_mrn.drop(columns='geometry')[['nom', 'population', 'surface_ha']] communes_mrn_qqs_colonnes
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.
= px.bar(
fig ='population', ascending=True),
communes_mrn.sort_values(by='nom', # Utiliser y pour les noms des communes
y='population', # Utiliser x pour les populations
x='Population des Communes de la MRN',
title={'nom': 'Commune', 'population': 'Population'},
labels='population',
text='h', # Graphique en barres horizontales
orientation=1200
height
)
fig
# Ajout d'une carte leaflet
communes_mrn.explore()
= communes_mrn.to_crs(epsg=4326)
communes_mrn
# Créer une carte centrée sur le centroïde
= folium.Map()
m
# se caler sur les limites de la couche
= communes_mrn.total_bounds
bbox = bbox
minx, miny, maxx, maxy = [[miny, minx], [maxy, maxx]]
bounds
m.fit_bounds(bounds)
# Choroplèthe
= folium.Choropleth(
chloropeth =communes_mrn,
geo_data=communes_mrn,
data=["nom", "population"],
columns="feature.properties.nom",
key_on="Reds",
fill_color=10,
bins=0.7,
fill_opacity=0.2,
line_opacity="Population / commune",
legend_name=True,
highlight
)
# Define the tooltips
= GeoJsonTooltip(
tooltip =['nom', 'population', "insee_com"],
fields=['Commune: ', 'Population: ', "Code INSEE:"],
aliases=True,
localize=False,
sticky=0,
smooth_factor=True,
labels="""
style background-color: #F0EFEF;
border: 2px solid black;
border-radius: 3px;
box-shadow: 3px;
font-size: 12px;
""",
=750,
max_width
)
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
= communes_mrn[communes_mrn['insee_com'] == '76540'][['population']]
pop_rouen_df
# et pour passer d'un dataframe à une simple valeur
= f"{pop_rouen_df.iloc[0, 0]:,}".replace(',', ' ') pop_rouen_value
Rouen compte 114 187 habitants.
Dans cette phrase, le nombre d’habitants est issus directement du code grace à la syntaxe inline code.