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
data_DPL_tendanciel_CENTRAL <- read_ods("data/20240913_resultats_DPL_tendanciel_CENTRAL.ods", sheet = 8, range = "B17:S51")

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_long <- data_DPL_tendanciel_CENTRAL %>%
  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_wide <- data_DPL_tendanciel_CENTRAL %>%
  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
colors <- c("Ménage par an – effet nouvelle population" = "blue",
            "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_chart <- ggplot(data_long, aes(x = `Libellé zonage`, y = valeur, fill = effet)) +
  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
interactive_chart <- ggplotly(ggplot_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
data_long_ojs = transpose (data_long)
Inputs.table(data_long_ojs,{
  header: {
    "valeur": "Nb de logements / an"
  },
  format: {
    "valeur": d => Math.round(d)
  }
})
Code
colorPalette = { return {
  "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.plot({
  marginLeft: 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: [
    Plot.barX(data_long_ojs.filter(d => d.effet != "Moyenne annuelle Demande Potentielle ménages"), {
      x: d => Math.round(d.valeur), 
      y: "Libellé zonage", 
      fill: "effet", 
      tip: true
    }),
    Plot.ruleX([0]),

    // Cercle pour le fond de texte
    Plot.dotX(data_long_ojs.filter(d => d.effet == "Moyenne annuelle Demande Potentielle ménages"), {
      x: "valeur",
      y: "Libellé zonage", 
      fill: "white",
      stroke: "black",
      r:12
    }),
    
    Plot.text(data_long_ojs.filter(d => d.effet == "Moyenne annuelle Demande Potentielle ménages"), {
      x: "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
bertin = require("bertin") // le ggplot de la carto en javascript

// on charge le géojson (préparé avec qgis à partir du shp avec reprojection en 4326)
zonage = FileAttachment("data/zonage.geojson").json()
epci = FileAttachment("data/epci.geojson").json()

// 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
data_wide_ojs = transpose(data_wide)
// toujours vérifier dans un tableau qu'on a bien ce qu'on pense avoir
Inputs.table(data_wide_ojs)
Code
data_wide_ojs_geojson = bertin.merge(zonage, "zones_dp_1", data_wide_ojs, "id", true)
Code
//console.log(data_wide_ojs_geojson)
//https://observablehq.com/@neocartocnrs/bertin-js-prop-symbols?collection=@neocartocnrs/bertin
bertin.draw({
  params: { 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", 
        d=> Math.round(d.properties["Moyenne annuelle Demande Potentielle ménages"])+        " ménages/an"
        ],
      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
bertin.draw({
  params: { 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 => d.properties["nom"]+'('+ d.properties["nature"]+')', 
        d => 'Zone n°'+d.properties["zones_dp_1"]+' : '+ d.properties["zones_dp_2"], 
        ]
    },
    { 
      type: "layer",
      geojson: zonage, 
      fill: "white", 
      fillOpacity: 0, 
      stroke: "black",
      strokeWidth: 2.5
    },
    {
      type:"tiles",
      style:"openstreetmap"
    },
  ]
})