import { aq, op } from '@uwdata/arquero' // le dplyr ou pandas du javascript
bertin = require("bertin") // le ggplot de la carto en javascript
import {view} from "@neocartocnrs/geoverview"
2025-03-12
Le format d’atelier permet de partager des techniques rapidement sans la lourdeur et l’investissement d’une formation
QUARTO est polyglotte : R, python, observable javascript, html, css, javascript etc…
Les notebooks permettent de mélanger facilement du code (traitements, tableaux, graphes, cartes etc…) et du texte (commentaires de chargé d’études !)
Un notebook peut être vu comme le chaînon manquant entre un environnement tableur/traitement de texte et une appli complexe avec du bigdata (appli web, Rshiny, python Dash etc…), mais c’est aussi un moyen simple pour faire de la documentation au format web.
Et surtout un notebook est :
Astuce
Pour l’utiliser avec Visual Studio Code
Télécharger R
Pour QUARTO, deux possibilités :
Vous avez installé R studio : rajouter simplement le chemin suivant dans les variables d’environnement C:\Program Files\RStudio\resources\app\bin\quarto\bin
(à adapter)
Vous ne comptez pas installer R studio : télécharger et installer quarto
Enfin, dans VSC téléchargez les extensions R et QUARTO
Le site ressource Quarto est très complet avec plusieurs approches possible pour l’apprentissage (get starded, guide et reference). C’est un outil de travail à ingurgiter en fonction des besoins. Pour les plus curieux, le forum de discussion permet également d’interagir avec d’autres utilisateurs et parfois même l’équipe de développement.
R studio propose des boîtes de dialogue pour créer un nouveau projet quarto :
- file\new project
Pour commencer, un Quarto project
permet de se familiariser avec les principes de bases.
3 fichiers ont été créé : - _quarto.yml : c’est un fichier de configuration, il va s’appliquer à tous les documents quarto présents dans le répertoire, il est surtout important pour les websites, book, blogs. Le format YAML est un standard plutôt lisible pour des fichiers de configuration notamment avec une indentation pour les arboresences. - exercice_1.qmd : c’est le fichier QuartoMarkDown, c’est là que tout va se passer et il contient déjà un en-tête en yaml, du texte, un bloc de code.
|
|
Un bouton render permet de visualiser le rendu (“avec une option render on save”). Les plus aguerris préfereront taper dans le terminal : quarto preview exercice_1.qmd pour prévisualiser et quarto render exercice_1.qmd pour faire un rendu complet. |
|
Le terminal permet de taper directement des lignes de commande, les lignes de commandes de Quarto offrent beaucoup de possibilités mais on peut s’en passer pour débuter. | |
Rstudio propose un onglet environnement très pratique pour visualiser les données ou connexions pour les codes en R | |
Deux modes d’édition sont possibles : Source et Visual. Le mode Visual ressemble à un petit traitement de texte et permet de faire des mises en pages sans connaître le markdown. C’est un bon point de départ mais les possibilités de mises en page sont bien plus grandes en mode Source que celles proposées dans ce mode Visual. |
Le mode visuel permet de gérer les titres, les puces, les numérotations, gras/italique, tableaux, images, hyperliens et propose quelques mises en forme couramment utilisées mais moins classique comme les blockquote, lineblock, callout, tabset, emoji.
Un raccourci bien pratique
taper / pour faire apparaître toutes les possibilités et vous éviter d’aller dans le menu !
Utiliser le mode visual et écrire un article en utilisant les possibilités proposées dans les menus.
Repasser en mode Source et observer la syntaxe, c’est un bon moyen d’apprendre mais le mieux est de vous lancer avec https://quarto.org/docs/authoring/markdown-basics.html
Pour aller plus loin, essayez de reproduire des parties de ce notebook démos des possibilités de mises en page
Copier coller des images, oui c’est possible !
En mode visual, vous pouvez copier coller des images à la volée, elles s’enregistreront automatiquement dans un répertoire images (qui se crééra automatiquement si besoin)
et le HTML ?
Et oui c’est possible aussi, si les possibilités du markdown ne vous suffisent pas… écrivez directement en html !
des icons prêt à l’emploi
Quarto intègre bootstrap et bsicons, pour mettre un icon, on peut écrire
Le résultat sera un joli icon :
Aperçu des mises en forme prêtes à l’emploi
Dans le fichier _quarto.yaml, rajouter le code suivant pour préciser le theme choisi et expérimentez avec les mises en forme possibles (themes) et essayer en plusieurs (exemple : darkly, quartz, vapor )
Une mise en forme personnalisée peut s’appuyer sur un theme existant et ne modifier que le nécessaire, exemple avec une ossature de site web :
Le fichier custom.scss déposé à la racine du projet contient uniquement les personnalisations nécessaire. Un custom.scss aux couleurs du cerema est déjà prêt à l’emploi.
Cette ossature de site web est dispo ici dans le zip des ressources téléchargeables
On va essayer de reproduire ce notebook R (avec widget HTML)
🤯 ne paniquez pas…
De base, lorsque vous allez mettre vos bouts de code :
output: true
)eval: true
)warning: true
)output: true
)Deux options s’offrent à vous :
true
et false
---
title: "Atelier Quarto - Exercice 1"
subtitle: "R avec WidgetHTML : tableau, graphe, carte, inline code"
toc: true
format:
html:
code-fold: true # les blocs de code seront repliés, NB : on n'est pas obligé de mettre de code, on peut juste afficher les résultats si l'on veut
code-summary: "Afficher le code" # message pour le symbole de flèche permettant de dérouler le code
execute:
warning: false # ne pas afficher les messages d'avertissement
---
… il y a beaucoup d’autres options plus subtiles dans la doc Quarto sur les options d’exécution
Si ce n’est pas déjà fait, installez les packages ci-dessous, R propose un menu dédié à la recherche et à l’installation des packages :
Utiliser le bouton pour ajouter un chunk de code (en R, python ou ojs) : Et voilà, on va commencer à coder ⌨️ dans des petits chunks.
library(dplyr) # package pour manipuler les données
library(ggplot2) # package pour les graphes
library(plotly) # package pour rendre un ggplot interactif
library(DT) # package pour afficher les résultats dans des tableaux HTML
library(sf) # package géographique de R
library(leaflet) # package pour les webmap
Etre admin ou ne pas être…
Une petite ligne de commande préalable pour installer Jupyter. Attention ! Il faut faire un clic droit ouvrir l'invite de commande en tant qu'administrateur
sinon vous aurez surement une erreur liés aux droits d’écriture…
Et donc pour installer jupyter : py -m pip install jupyter
Puis les librairies nécessaires
pip install plotly
pip install geopandas
pip install pandas
pip install mapclassify
pip install folium
Ajouter un chunk python et commencer à coder :
Télécharger la donnée communes_mrn.geojson
communes_mrn = FileAttachment("data/communes_mrn_crs4326.geojson").json()
// on va manipuler la donnée differement en javascript... cf prochain chunk !
// On commence ici par créer le tableau de donnée correspondant aux propriétés du geojson avec une fonction bien pratique de la librairie bertin
communes_mrn_table = bertin.properties.table(communes_mrn)
<IPython.core.display.HTML object>
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
.. ... ... ...
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
[71 rows x 3 columns]
Ecrire du code peut paraître un peu fastidieux au début… mais ces quelques lignes sont beaucoup plus logiques que :
Se demander avec quoi on ouvre un geojson…
Se demander comment convertir un geojson en excel
Ouvrir dans excel le fichier, sélectionner les colonnes à supprimer, cliquer sur supprimer les colonnes en se demandant si il faudrait pas faire une copie au cas où
Faire un copier coller de ce tableau dans une page A4 et se demander comment la mettre en page
Se rendre compte vous avez une donnée à corriger… et tout recommencer
L’environnement des notebooks, en plus d’être libre et gratuit, vous permet de gérer absolument tous les formats (xls, csv, json, geojson, gpkg, shp, postgres, parquet etc…) dans un même environnement. Une fois une technique apprise, un simple copier coller vous permet de réinvestir vos connaissances.
Et si vous modifiez la donnée (mise à jour annuelle par exemple)… il suffit de relancer votre notebook pour que tout se mette à jour 🤩.
# Utilisation de la librairie ggplot pour faire un graphe
g <- ggplot(communes_mrn, aes(x = reorder(nom, population), y = population)) +
geom_bar(stat = "identity", fill = "purple", color = "white") + # identity ou count pour les stats
coord_flip() +
labs(
x = "Région",
y = "Communes"
) +
theme_minimal()
# transformation en un graphe interactif
ggplotly(g,width = 600, height = 1200)
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
En mal d’inspiration ? Besoin d’idées ?
Il est possible de faire des graphes avec des glisser déposer
et de générer le code correspondant… plus d’excuse pour ne pas se mettre à la dataviz ! Comment installer et utiliser Esquisse
# Au préalable, il est nécessaire de reprojeter la couche dans CRS attendu par leaflet
# En général les geojson sont directement en 4326 mais ayez en tête que si vous ne voyez pas vos données, c'est surement un problème de projection !
communes_mrn <- st_transform(communes_mrn, crs = 4326)
# Ajout d'une carte leaflet
leaflet(communes_mrn) %>% # on indique la donné
addTiles() %>% # on charge le fond de plan de base (osm)
addPolygons() # on ajoute les polygones de la donnée
# Calcul de la densité de population avec les fonctions de R
communes_mrn$densite_population = round( communes_mrn$population / communes_mrn$surface_ha )
# Création d'une palette de couleur
palette2 <- colorBin(palette = "Blues", domain = communes_mrn$densite_population, bins = 10)
# Le code ci-dessous est un copier collé de la documentation avec quelques adaptations, cela peut sembler fastidieux mais une fois la logique intégrée, faire des cartes prend le temps de changer le nom de l'indicateur...
leaflet(communes_mrn) %>%
addTiles() %>%
addPolygons(
fillColor = ~palette2(densite_population),
weight = 1,
color = "black",
fillOpacity = 0.7,
highlightOptions = highlightOptions(
weight = 3,
color = "#666",
fillOpacity = 0.9,
bringToFront = TRUE
),
label = ~paste("Commune:", nom, " Densité:", densite_population," habitants par hectare")
) %>%
addLegend(
pal = palette2,
values = ~densite_population,
opacity = 0.7,
title = "Population",
position = "bottomright"
)
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)
<folium.features.GeoJson object at 0x00000234CE963F50>
<folium.features.Choropleth object at 0x00000234E067EC90>
<folium.map.LayerControl object at 0x00000234E06B4770>
// La librairie bertin est développé par un géographe français et très bien documentée
bertin.draw({
params: { projection:"Mercator", margin: 50},
layers: [
{
type: "layer",
geojson: communes_mrn,
stroke:"black",
fill: {
type: "choro",
values: "population",
nbreaks: 5,
method: "jenks",
colors: "Reds",
leg_round: -1,
leg_title: `Population`,
leg_x: 10,
leg_y: 10
},
fillOpacity: 0.5,
tooltip: ["$nom","$population"]
},
{
type:"tiles",
style:"openstreetmap"
},
]
})
population
1 114 187
Rouen compte 114 187 habitants.
Dans cette phrase, le nombre d’habitants est issus directement du code grace à la syntaxe inline code.
114 187
Rouen compte {python} pop_rouen_value
habitants.
Dans cette phrase, le nombre d’habitants est issus directement du code grace à la syntaxe inline code.
Rouen compte habitants.
Dans cette phrase, le nombre d’habitants est issus directement du code grace à la syntaxe inline code.
quarto preview quarto_presentation_reveal.qmd --to revealjs --presentation --no-watch-inputs --no-browse
selon les options sélectionnéesquarto preview
(+ préciser le nom du fichier si besoin) dans le terminal et hop votre projet va s’afficher et se mettre à jour à chaque sauvegardequarto render
(préciser le nom du fichier si besoin) dans le terminal et hop votre projet va être tricoté et prêt à être publiéIl y a plusieurs possibilités pour diffuser vos résultats sur le web :
Astuce
Et si vous n’avez pas mis de fonctionnalités avancées, votre html sera autonome lisible tel quel (mail, clef usb, simple fichier sur votre disque dur) !
Vos données sont publiques ? Votre projet fait moins de 100 Mo ? Quarto Pub vous permet de diffuser sur le web !
quarto publish quarto-pub
dans le terminalEt maintenant, sur la page dans votre compte Quarto Pub vous voyez votre projet avec une adresse web pour le diffuser💓.
La DDTM76 propose sur son dépôt Gitlab un template de repo pour pouvoir créer une gitlabpages et la publier (nécessité d’avoir un compte cerbérisé et les droits sur l’instance ministérielle) :
EZ Quarto GitPage
Les principes essentiels :
Téléchargez un .zip de toutes les ressources
Maîtriser le markdown : Mises en page : les classiques et quelques bonus
Tableau, graphe, carte, code intégré
R (avec widget HTML)
Python
Observable JavaScript (ojs)
Exemple avec interactivité en ojs
Arquero, le dplyr du javascript
Duckdb et le tout SQL
Multiformat html, docx, pdf :
R et latex
R et typst
Lire un .ods, graphe stackbar + dot en ojs : .ods avec R et OJS
Ossature de website avec mise en forme personnalisée :
Jouer avec les paramètres de bases d’Observable Plot pour tuner un graphe : OJS Plot
Les notebooks offrent de nombreuses possibilités et la courbe de progression est assez douce si l’on commence par faire de simples articles.
Ils sont particulièrement adaptés pour :
la documentation
les articles simples de type scientifiques (c’est le standard pour les publications web)
les rendus sous forme de sites web ou webbook
le travail en équipe aux profils variés (exemple : différentes personnes pour rédiger le contexte et les enjeux, préparer les données sous postgres, faire un traitement python, mettre en place une dataviz, commenter les résultats)
les proofs of concept (POC) de dataviz avant de passer sur une archi plus lourde
… et les diaporamas comme celui ci, qui utilise le moteur reveal.js
DTERNC/GVUUB