Atelier Quarto - Exercice 1

Python : tableau, graphe, carte, inline code

Chargement des librairies

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.

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

Chargement d’un json et sélection de colonnes

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.

Afficher le code
# 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']]

Affichage d’un tableau

Et voici un affichage sous forme de tableau HTML.

Afficher le code
# 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

Un premier graphe

Ensuite, il est assez simple de faire un graphe avec la grammaire de base de la librairie plotly.

Afficher le code
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
39643751054455859361762270771874988188589892296010201029103711761180118212121212125413071366139715361675169320272242229023512378256229183108329936013617399040104149483149196099616064666966792581978251842887329731978099961064410845122661380714378160871968621997260342833129071114187020k40k60k80k100k120kHautot-sur-SeineYville-sur-SeineÉpinay-sur-DuclairBerville-sur-SeineFontaine-sous-PréauxQuevillonLe Mesnil-sous-JumiègesBardouvilleLa BouilleVal-de-la-HayeSotteville-sous-le-ValOrivalSaint-Pierre-de-MannevilleGouyMoulineauxFreneuseSaint-Aubin-ÉpinayQuévreville-la-PoterieYainvilleAnneville-AmbourvilleSaint-Aubin-CellovilleYmareRoncherolles-sur-le-VivierSahursLes Authieux-sur-le-Port-Saint-OuenSaint-PaërHénouvilleMontmainSaint-Martin-de-BoschervilleSaint-Martin-du-VivierJumiègesSainte-Marguerite-sur-DuclairBelbeufSaint-Pierre-de-VarengevilleLa LondeLa Neuville-Chant-d'OiselTourville-la-RivièreHouppevilleSaint-Jacques-sur-DarnétalAmfreville-la-Mi-VoieIsneauvilleSaint-Léger-du-Bourg-DenisBoosDuclairLe HoulmeLe TraitCléonFranqueville-Saint-PierreMalaunayBonsecoursNotre-Dame-de-BondevilleLe Mesnil-EsnardBihorelSaint-Pierre-lès-ElbeufSaint-Aubin-lès-ElbeufPetit-CouronneGrand-CouronneDarnétalCaudebec-lès-ElbeufDéville-lès-RouenMarommeOisselCanteleuBois-GuillaumeElbeufMont-Saint-AignanLe Petit-QuevillyLe Grand-QuevillySaint-Étienne-du-RouvraySotteville-lès-RouenRouen
Population des Communes de la MRNPopulationCommune

Une première carte pour vérifier les géométries

Afficher le code
# Ajout d'une carte leaflet
communes_mrn.explore()
Make this Notebook Trusted to load map: File -> Trust Notebook

Une carte en aplat de couleurs

Afficher le code
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
Make this Notebook Trusted to load map: File -> Trust Notebook

Mélanger texte et résultats avec du inline

Afficher le code
# 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.