De la création d’un graphique de type SANSEY pour les données de type BUDGET

Application d’un graphique sur mes données de budget
R
Sansey
Budget
Auteur·rice

GOLLENTZ Quentin

Date de publication

01-04-2026

Chargement des librairies

Code
library(networkD3)
library(tidyverse)
library(readODS)

path <- getwd()
print(path)
[1] "/home/goldentzgrahamz/Documents/PROJET_PERSO/quarto_blog/posts/sankey_graph"
Code
data <- read_ods(paste0(path,"/data/budget_sankey.csv"))

nodes <- unique(c(data$source, data$target))

# Attribuer un groupe à chaque nœud (exemple : "Revenus", "Dépenses", etc.)
node_groups <- data.frame(
  name = nodes,
group  = c(
  "REVENUE",            # 1  RECETTE FIXE
  "REVENUE",            # 2  SALAIRE NET
  "REVENUE",            # 3  RECETTE
  "DEPENSE",            # 4  DEPENSE FIXE
  "REVENUE",            # 5  RECETTE VARIABLE
  "DEPENSE",            # 6  DEPENSE VARIABLE
  "REVENUE",            # 7  REMBOURSEMENT CREANCE
  "INVESTISSEMENT",     # 8  INVESTISSEMENT
  "DEPENSE",            # 9  LOISIRS
  "REVENUE",            # 10 AIDE TRANSPORT
  "REVENUE",            # 11 DIVIDENDE ET INTERET
  "REVENUE",            # 12 TICKET RESTAURANT
  "DEPENSE",            # 13 LOYER + CHARGE
  "DEPENSE",            # 14 IMPREVU
  "DEPENSE",            # 15 FRAIS DE TRANSPORT
  "DEPENSE",            # 16 FRAIS DE NOURRITURE
  "INVESTISSEMENT",     # 17 PRÊT
  "INVESTISSEMENT",     # 18 THESAURISATION
  "INVESTISSEMENT",     # 19 BOURSE
  "INVESTISSEMENT",     # 20 EPARNE
  "DEPENSE",            # 21 DEUTSCHKURS
  "DEPENSE",            # 22 FRAIS MEDICAUX
  "DEPENSE",            # 23 FRAIS CHAT
  "DEPENSE",            # 24 IMPOT
  "DEPENSE",            # 25 FRAIS DE NOEL
  "DEPENSE",            # 26 TELEPHONE MOBILE
  "DEPENSE",            # 27 ELECTRICITE
  "DEPENSE",            # 28 BBOX
  "DEPENSE",            # 29 BANQUE
  "DEPENSE",            # 30 ASSURANCE HABITATION
  "DEPENSE",            # 31 FRAIS DE VELO
  "DEPENSE"             # 32 VOCABLE
)
)

# Préparation des données
links <- data.frame(
  source = match(data$source, unique(c(data$source, data$target))) - 1,
  target = match(data$target, unique(c(data$source, data$target))) - 1,
  value = data$value
)

nodes <- data.frame(
  name = unique(c(data$source, data$target))
)


# Création du graphique interactif
sankey_widget <-
sankeyNetwork(
  Links = links,
  Nodes = node_groups,
  Source = "source",
  Target = "target",
  Value = "value",
  NodeID = "name",
  NodeGroup = "group",  # Utilise la colonne 'group' pour les couleurs
  colourScale = "d3.scaleOrdinal().range(['#177245', '#d70a53', '#ffa812'])",
  fontSize = 14,
  nodeWidth = 30,
  sinksRight = FALSE,
  margin = list(right = 50, left = 50, top = 20, bottom = 20),
  iterations = 64
) 


#javascript_string <- '
#function(el) {
#  d3.select(el).selectAll(".link")
#    .style("stroke", d => d.source.color);
#}'

#htmlwidgets::onRender(x = sankey_widget, jsCode = javascript_string)

sankey_widget