Lecture de la donnée directement dans le .ods
Code
# install.packages("readODS")
library(readODS)
# lecture d'une plage de donnée dans le 8ème onglet
<- read_ods("data/20240913_resultats_DPL_tendanciel_CENTRAL.ods", sheet = 8, range = "B17:S51") data_DPL_tendanciel_CENTRAL
Afficher un tableau de donnée
Code
library(DT)
datatable(data_DPL_tendanciel_CENTRAL)
Préparer la donnée
Pour représenter des diagrammes en barres empilés, le plus simple est de passer les données au “format long” avec un pivot.
Code
library(tidyr)
library(dplyr)
# Transformer les données en format long pour ggplot2
<- data_DPL_tendanciel_CENTRAL %>%
data_long select("Libellé zonage","Ménage par an – effet nouvelle population","Ménage par an – effet déformation pyramide des âges","Ménage par an – effet évolution des modes de cohabitation","Renouvellement par an","Vacance par an","Résidences Secondaires et Logts Occasion. par an", "Moyenne annuelle Demande Potentielle ménages") %>%
pivot_longer(cols = -"Libellé zonage", names_to = "effet", values_to = "valeur")
# On va garder les données au format wide qd même, juste un select
<- data_DPL_tendanciel_CENTRAL %>%
data_wide select("id","Libellé zonage","Ménage par an – effet nouvelle population","Ménage par an – effet déformation pyramide des âges","Ménage par an – effet évolution des modes de cohabitation","Renouvellement par an","Vacance par an","Résidences Secondaires et Logts Occasion. par an", "Moyenne annuelle Demande Potentielle ménages","Moyenne annuelle pour 1000 ménages Demande Potentielle")
Créer un graphe en “stack bar” avec R/ggplot
NB : chat gpt est très bon en R…
Code
library(ggplot2)
library(plotly)
# Définir les couleurs correspondant à chaque catégorie
<- c("Ménage par an – effet nouvelle population" = "blue",
colors "Ménage par an – effet déformation pyramide des âges" = "purple",
"Ménage par an – effet évolution des modes de cohabitation" = "cyan",
"Renouvellement par an" = "red",
"Vacance par an" = "yellow",
"Résidences Secondaires et Logts Occasion. par an" = "green")
# Créer le graphique en barres empilées
<- ggplot(data_long, aes(x = `Libellé zonage`, y = valeur, fill = effet)) +
ggplot_chart geom_bar(stat = "identity") +
scale_fill_manual(values = colors) +
labs(x = "Libellé zonage", y = "Valeur", fill = "Catégorie") +
coord_flip() +
theme_minimal()
# Convertir en graphique interactif avec ggplotly
<- ggplotly(ggplot_chart)
interactive_chart
# Afficher le graphique interactif
interactive_chart
Créer un graphe en “stack bar” avec Observable/plot
Code
# On passe la donnée préparéen R au javascript :
ojs_define(data_long)
ojs_define(data_wide)
R utilise un format en colonnes, pas le javascript, une fonction permet de remettre en ordre la donnée
Code
= transpose (data_long)
data_long_ojs .table(data_long_ojs,{
Inputsheader: {
"valeur": "Nb de logements / an"
,
}format: {
"valeur": d => Math.round(d)
} })
Code
= { return {
colorPalette "Ménage par an – effet nouvelle population": "#A6CEE3", // Bleu pastel
"Ménage par an – effet déformation pyramide des âges": "#CAB2D6", // Violet pastel
"Ménage par an – effet évolution des modes de cohabitation": "#B2DFDB", // Cyan pastel
"Renouvellement par an": "#FB9A99", // Rouge pastel
"Vacance par an": "#FFEB99", // Jaune pastel
"Résidences Secondaires et Logts Occasion. par an": "#B2DF8A" // Vert pastel
;
}}
.plot({
PlotmarginLeft: 220,
height: 1100,
style: {
fontSize: 12,
,
}x: {grid: true, label: "Nb de logements / an"},
color: {legend: true, domain: Object.keys(colorPalette), range: Object.values(colorPalette)},
marks: [
.barX(data_long_ojs.filter(d => d.effet != "Moyenne annuelle Demande Potentielle ménages"), {
Plotx: d => Math.round(d.valeur),
y: "Libellé zonage",
fill: "effet",
tip: true
,
}).ruleX([0]),
Plot
// Cercle pour le fond de texte
.dotX(data_long_ojs.filter(d => d.effet == "Moyenne annuelle Demande Potentielle ménages"), {
Plotx: "valeur",
y: "Libellé zonage",
fill: "white",
stroke: "black",
r:12
,
})
.text(data_long_ojs.filter(d => d.effet == "Moyenne annuelle Demande Potentielle ménages"), {
Plotx: "valeur",
y: "Libellé zonage",
text: d => Math.round(d.valeur).toLocaleString('fr-FR'),
//stroke:"white",
//fill:"black",
fontSize :10,
textAnchor: "middle"
})
] })
Créer une carte avec Bertin.js
Code
= require("bertin") // le ggplot de la carto en javascript
bertin
// on charge le géojson (préparé avec qgis à partir du shp avec reprojection en 4326)
= FileAttachment("data/zonage.geojson").json()
zonage = FileAttachment("data/epci.geojson").json()
epci
// import {view} from "@neocartocnrs/geoverview"
// view(zonage)
// on récupère la donnée préparée avec R et on passe d'un format colonne à un format javascript
= transpose(data_wide)
data_wide_ojs // toujours vérifier dans un tableau qu'on a bien ce qu'on pense avoir
.table(data_wide_ojs) Inputs
Code
= bertin.merge(zonage, "zones_dp_1", data_wide_ojs, "id", true) data_wide_ojs_geojson
Code
//console.log(data_wide_ojs_geojson)
//https://observablehq.com/@neocartocnrs/bertin-js-prop-symbols?collection=@neocartocnrs/bertin
.draw({
bertinparams: { projection:"Mercator", margin: 50},
layers: [
{type: "bubble",
geojson: data_wide_ojs_geojson,
stroke:"black",
values: "Moyenne annuelle Demande Potentielle ménages",
k: 60,
tooltip: [
"$Libellé zonage",
=> Math.round(d.properties["Moyenne annuelle Demande Potentielle ménages"])+ " ménages/an"
d,
]fill: {
type: "split",
values: "Moyenne annuelle Demande Potentielle ménages",
colors: ["#4a7cd9", "#F25842"],
split: 0,
leg_x: 300,
leg_y: 10
,
}fillOpacity: 0.5,
leg_round: -1,
leg_title: `Moyenne annuelle Demande Potentielle`,
leg_x: 10,
leg_y: 10
,
}
{ type: "layer",
geojson: zonage,
fill: "white",
fillOpacity: 0.33,
stroke: "black",
strokeWidth: 2.5
,
}
{type:"tiles",
style:"openstreetmap"
,
}
] })
Code
epci
Code
zonage
Code
.draw({
bertinparams: { projection:"Mercator", margin: 50},
layers: [
{type: "label",
geojson: zonage,
values: "zones_dp_1",
fontWeight: "bold",
fontSize: 20,
halo: true,
halo_style: ["white", 10, 1]
,
}
{ type: "layer",
geojson: epci,
fill: "white",
fillOpacity: 0.33,
stroke: "black",
strokeWidth: 1,
//tooltip: ["$nom", "$nature", "Zonage DPL : ", "$zones_dp_1","$zones_dp_2"]
tooltip: [
=> d.properties["nom"]+'('+ d.properties["nature"]+')',
d => 'Zone n°'+d.properties["zones_dp_1"]+' : '+ d.properties["zones_dp_2"],
d
],
}
{ type: "layer",
geojson: zonage,
fill: "white",
fillOpacity: 0,
stroke: "black",
strokeWidth: 2.5
,
}
{type:"tiles",
style:"openstreetmap"
,
}
] })