library(fontawesome)
library(ggplot2)
library(kableExtra)
library(ggthemes)
library(WDI)
library(dplyr)
##
## Attaching package: 'dplyr'
## The following object is masked from 'package:kableExtra':
##
## group_rows
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
library(scales)
library(forcats)
library(likert)
## Loading required package: xtable
##
## Attaching package: 'likert'
## The following object is masked from 'package:dplyr':
##
## recode
library(scales)
library(forcats)
library(ggpmisc)
## Loading required package: ggpp
##
## Attaching package: 'ggpp'
## The following object is masked from 'package:ggplot2':
##
## annotate
library(tidyverse)
## -- Attaching packages --------------------------------------- tidyverse 1.3.1 --
## v tibble 3.1.2 v purrr 0.3.4
## v tidyr 1.1.3 v stringr 1.4.1
## v readr 2.1.3
## -- Conflicts ------------------------------------------ tidyverse_conflicts() --
## x ggpp::annotate() masks ggplot2::annotate()
## x readr::col_factor() masks scales::col_factor()
## x purrr::discard() masks scales::discard()
## x dplyr::filter() masks stats::filter()
## x dplyr::group_rows() masks kableExtra::group_rows()
## x dplyr::lag() masks stats::lag()
## x likert::recode() masks dplyr::recode()
library(ggparliament)
Nous initialisons le thème qui sera utilisé pour tous les graphiques de ce chapitre
# Je crée mon thème à partir du thème par défaut "theme_gray" moyennant quelques modifications
Conrad_Theme <- function (base_size = 12, base_family = "Roboto Condensed") {
half_line <- base_size/2
theme(
line = element_line(color = "black", size = .5,
linetype = 1, lineend = "butt"),
rect = element_rect(fill = "white", color = "black",
size = .5, linetype = 1),
text = element_text(family = base_family, face = "italic",
color = "black", size = base_size,
lineheight = .9, hjust = .5, vjust = .5,
angle = 0, margin = margin(), debug = FALSE),
axis.line = element_blank(),
axis.line.x = NULL,
axis.line.y = NULL,
axis.text = element_text(size = 10, color = "#3C6E71"),
axis.text.x = element_text(margin = margin(t = .8 * half_line/2),
vjust = 1),
axis.text.x.top = element_text(margin = margin(b = .8 * half_line/2),
vjust = 0),
axis.text.y = element_text(margin = margin(r = .8 * half_line/2),
hjust = 1),
axis.text.y.right = element_text(margin = margin(l = .8 * half_line/2),
hjust = 0),
axis.ticks = element_line(color = "#3C6E71", size = .7),
axis.ticks.length = unit(half_line / 1.5, "pt"),
axis.ticks.length.x = NULL,
axis.ticks.length.x.top = NULL,
axis.ticks.length.x.bottom = NULL,
axis.ticks.length.y = NULL,
axis.ticks.length.y.left = NULL,
axis.ticks.length.y.right = NULL,
axis.title.x = element_text(color = "#3C6E71", hjust=1,
vjust = 1, size = 10,
face = "bold.italic"),
axis.title.x.top = element_text(margin = margin(b = half_line),
vjust = 0),
axis.title.y = element_text(color = "#3C6E71", angle = 90, vjust = 1,
hjust=.5, size = 10, face = "bold.italic"),
axis.title.y.right = element_text(angle = -90, vjust = 0,
margin = margin(l = half_line)),
legend.background = element_rect(color = NA),
legend.spacing = unit(.4, "cm"),
legend.spacing.x = NULL,
legend.spacing.y = NULL,
legend.margin = margin(.2, .2, .2, .2, "cm"),
legend.key = element_rect(fill = "#FFE5D9", color = "#FFE5D9"),
legend.key.size = unit(1.2, "lines"),
legend.key.height = NULL,
legend.key.width = NULL,
legend.text = element_text(color="#3C6E71", size = rel(.8)),
legend.text.align = NULL,
legend.title = element_text(color="#3C6E71", hjust = 0, face="bold.italic"),
legend.title.align = NULL,
legend.position = "top",
legend.direction = NULL,
legend.justification = "center",
legend.box = NULL,
legend.box.margin = margin(0, 0, 0, 0, "cm"),
legend.box.background = element_blank(),
legend.box.spacing = unit(.4, "cm"),
panel.background = element_rect(fill = "#FEEAFA", color = NA),
panel.border = element_rect(color = "#FFFFFF",
fill = NA, size = .7),
panel.grid.major = element_line(color = "#FEEAFA", size = .1, linetype = "dotted"),
panel.grid.minor = element_line(color = "#FEEAFA", size = .1,
linetype = "dotted"),
panel.spacing = unit(base_size, "pt"),
panel.spacing.x = NULL,
panel.spacing.y = NULL,
panel.ontop = FALSE,
strip.background = element_rect(fill = "white", color = "gray30"),
strip.text = element_text(color = "black", size = base_size),
strip.text.x = element_text(margin = margin(t = half_line,
b = half_line)),
strip.text.y = element_text(angle = -90,
margin = margin(l = half_line,
r = half_line)),
strip.text.y.left = element_text(angle = 90),
strip.placement = "inside",
strip.placement.x = NULL,
strip.placement.y = NULL,
strip.switch.pad.grid = unit(0.1, "cm"),
strip.switch.pad.wrap = unit(0.1, "cm"),
plot.background = element_rect(color = "#FEEAFA"),
plot.title = element_text(size = 12, hjust = 0, colour = "#3C6E71",
vjust = 1, face = "bold",
margin = margin(b = half_line * 1.2)),
plot.title.position = "panel",
plot.subtitle = element_text(size = 10, colour = "#3C6E71", face="bold.italic",
hjust = 0, vjust = 1,
margin = margin(b = half_line * .9)),
plot.caption = element_text(size = 10, colour = "red", face="italic",
hjust = 0, vjust = 1,
margin = margin(t = half_line * .9)),
plot.caption.position = "panel",
plot.tag = element_text(size = rel(1.2), hjust = .5, vjust = .5),
plot.tag.position = "topleft",
plot.margin = margin(base_size, base_size, base_size, base_size),
complete = TRUE
)
}
theme_set(Conrad_Theme())
## Warning: The `size` argument of `element_line()` is deprecated as of ggplot2 3.4.0.
## i Please use the `linewidth` argument instead.
## Warning: The `size` argument of `element_rect()` is deprecated as of ggplot2 3.4.0.
## i Please use the `linewidth` argument instead.
Mes_couleurs <- c("#202020", "#20BF55", "#832161",
"#FFD100", "#564787", "#OD21A1",
"#75C9C8")
scale_colour_discrete <- function(...) {
scale_colour_manual(..., values = Mes_couleurs)
}
Les oppositions mettent l’accent sur les variations positives et négatives (+/-) à partir d’un point de référence fixe. Généralement, le point de référence est zéro, mais il peut également s’agir d’un objectif (target) ou d’une moyenne à long terme. Ces visualisations peuvent également être utilisées pour décrire des sentiments (positif/neutre/négatif)
C’est un graphique à barres standard qui peut gérer à la fois les valeurs de magnitude négatives et positives notez bien que les informations sont en valeurs absolues.
En guise de préparation des données, téléchargeons et attachons le package WDI qui contient les données de la banque mondiale sur les économies des pays de ses pays membres (World Development Indicators series and country information). nous sélectionnons le cameroun et nous choisissons la variable BN.CAB.XOKA.CD qui représente le solde annuel du compte courant sur la période.
WDI_data_CMR <- WDI(
country = "CMR",
indicator = "BN.CAB.XOKA.CD", #Current account balance (BoP, current US$)
start = 1960,
end = 2022,
extra = FALSE,
cache = NULL,
latest = NULL,
language = "en"
)%>%filter(year>=2006)%>%
mutate(Année=year,
Solde_Cpte_Courant=round(BN.CAB.XOKA.CD/1000000, digits = 0),
Situation_Balance=if_else(BN.CAB.XOKA.CD>0,"Excédant", "Déficit"))%>%
select(Année, Solde_Cpte_Courant, Situation_Balance)
head(WDI_data_CMR)%>%
kbl(caption = "Tableau final après traitement") %>%
kable_classic(full_width = F, html_font = "Cambria")
| Année | Solde_Cpte_Courant | Situation_Balance |
|---|---|---|
| 2021 | -1795 | Déficit |
| 2020 | -1512 | Déficit |
| 2019 | -1695 | Déficit |
| 2018 | -1409 | Déficit |
| 2017 | -950 | Déficit |
| 2016 | -1037 | Déficit |
Nous pouvons sur la base de ce tableau final faire le graphique à barres divergentes
color <- ifelse(WDI_data_CMR$Situation_Balance == "Déficit", "#202020", "#FFD100")
ggplot(WDI_data_CMR, aes(x = reorder(Année, Solde_Cpte_Courant), y = Solde_Cpte_Courant)) +
geom_bar(stat = "identity",
show.legend = TRUE,
fill = color, # Background color
color = "white") +
geom_text(aes(label = Solde_Cpte_Courant,
hjust = ifelse(Solde_Cpte_Courant < 0, 1.5, -1),
vjust = 0.5),
size = 3) +
ggtitle(label=expression(paste(bold(underline("Visualisation 1:")),bold("graphique à barres divergentes"))),
subtitle ="(Le solde de la balance courante du Cameroun est structurellement déficitaire jusqu'en 2006)")+
labs(x="Année", y="Solde_Cpte_Courant(En $US Courant)", caption = expression(paste(italic(underline("Source:")),italic(" Données issues de 'WDI_data' du package WDI de R, Banque Mondiale"))))+
coord_flip()+
scale_y_continuous(breaks= seq(-2000, 300, by = 300),
limits = c(min(WDI_data_CMR$Solde_Cpte_Courant) - 50,
max(WDI_data_CMR$Solde_Cpte_Courant) + 50))+
Conrad_Theme()
Ce type de graphique est parfait pour présenter des résultats d’enquête qui impliquent un sentiment (par exemple, en désaccord, neutre, d’accord). en feet, Un graphique à barres divergentes empilées est un graphique qui utilise des barres pour montrer des comparaisons entre des catégories de données, mais avec la possibilité de décomposer et de comparer des parties d’un tout dans une gradation qui va du moins bon (négatif) vers le très bon (positf) . Chaque barre du graphique représente un tout, et les segments de la barre représentent différentes parties ou catégories de ce tout.
Ici nous utilisons les données d’enquête sur la qualité de l’éducation dans des écoles d’un district des états USA.
library(likert)
library(scales)
library(forcats)
data("pisaitems")
items28 <- pisaitems[, substr(names(pisaitems), 1, 5) == "ST24Q"]
items282<-items28%>%tidyr::gather(schools, opinion, ST24Q01:ST24Q11)%>%filter(!opinion=="NA")
school_quality_summary<-items282%>%dplyr::group_by(schools, opinion)%>%count(name = "n_answers") %>%
group_by(schools) %>%mutate(percent_answers = n_answers / sum(n_answers, na.rm = TRUE)) %>%
ungroup() %>%mutate(percent_answers_label = percent(percent_answers, accuracy = 1))
school_quality_summary_diverging <- school_quality_summary %>%
mutate(percent_answers = if_else(opinion %in% c("Agree", "Strongly agree"), percent_answers, -percent_answers)) %>%
mutate(percent_answers_label = percent(percent_answers, accuracy = 1))
school_quality_summary_diverging_good_labels <- school_quality_summary_diverging %>%
mutate(percent_answers_label = abs(percent_answers)) %>%
mutate(percent_answers_label = percent(percent_answers_label, accuracy = 1))
school_quality_summary_diverging_right_order <- school_quality_summary_diverging_good_labels %>%
mutate(opinion = fct_relevel(opinion, "Strongly disagree", "Disagree", "Agree", "Strongly agree"),
opinion = fct_rev(opinion))
head(school_quality_summary_diverging_right_order)%>%
kbl(caption = "Tableau final après traitement") %>%
kable_classic(full_width = F, html_font = "Cambria")
| schools | opinion | n_answers | percent_answers | percent_answers_label |
|---|---|---|---|---|
| ST24Q01 | Agree | 20000 | 0.3053855 | 31% |
| ST24Q01 | Disagree | 23515 | -0.3590570 | 36% |
| ST24Q01 | Strongly agree | 7029 | 0.1073277 | 11% |
| ST24Q01 | Strongly disagree | 14947 | -0.2282298 | 23% |
| ST24Q02 | Agree | 20935 | 0.3193453 | 32% |
| ST24Q02 | Disagree | 23811 | -0.3632162 | 36% |
school_quality_summary_diverging_right_order %>%
ggplot(aes(x = schools,
y = percent_answers,
fill = opinion)) +
geom_col() +
geom_text(aes(label = percent_answers_label), position = position_stack(vjust = 0.5), color="white") +
coord_flip() +
scale_x_discrete() +
scale_fill_manual(breaks = c("Strongly disagree", "Disagree", "Agree", "Strongly agree"),
values = c(
"Strongly disagree" = "#202020",
"Disagree" = "#20BF55",
"Agree" = "#832161",
"Strongly agree" = "#FFD100"
)) +
ggtitle(label=expression(paste(bold(underline("Visualisation 2:")),bold("graphique à barres divergentes empilées"))),
subtitle ="(Comment qualifierez-vous la qualité de l'éducation dans votre école?)")+
labs(x="School_Name", fill=NULL, caption = expression(paste(italic(underline("Source:")),italic(" Données issues de 'pisaitems' du package likert de R"))))+
Conrad_Theme()
### II-1-3 Le graphique Déficit/Excédant à barres
Ce type de graphique est fait pour présenter l’evolution des performances commerciales dans le temps. il peut s’agir de celle d’une entreprise (Recettes-Dépenses) ou alors celles d’une nation (Exportations-Importations) il permet également de regarder les performances par rapport à un objectif qu’on s’est fixé (Ventes Réelles - Prévisions de Vente). il est approprié lorsque le temps est discret (Année, Trimestre, Mois…) pour les valeurs infinitésimales du temps il faut utiliser une courbe (Cf. section suivante)
Dans cet exemple nous allons analyser les importations et les exportations du Cameroun depuis (1977) date à partir de laquelle les statistiques sont disponibles.
EXP_IMP <- WDI(
country = "CMR",
indicator = c("BX.GSR.GNFS.CD", "BM.GSR.TOTL.CD"), #Exportations & importation of goods and services
start = 1960,
end = 2022,
extra = FALSE,
cache = NULL,
latest = NULL,
language = "en"
)
EXP_IMP2<-EXP_IMP%>%filter(year>=1977)%>%
mutate(Année=year,
Surplus_Deficit=BX.GSR.GNFS.CD-BM.GSR.TOTL.CD)%>%
mutate(Situation_BC=if_else(Surplus_Deficit>0,"Excédant", "Déficit"))%>%
select(Année, Surplus_Deficit, Situation_BC)
head(EXP_IMP2)%>%
kbl(caption = "Tableau final après traitement") %>%
kable_classic(full_width = F, html_font = "Cambria")
| Année | Surplus_Deficit | Situation_BC |
|---|---|---|
| 1977 | -132693103 | Déficit |
| 1978 | -203717289 | Déficit |
| 1979 | -138161775 | Déficit |
| 1980 | -493185438 | Déficit |
| 1981 | -505204674 | Déficit |
| 1982 | -393480036 | Déficit |
EXP_IMP5<-EXP_IMP%>%filter(year>=1977)%>%
mutate(Année=year,
EXP=round(BX.GSR.GNFS.CD/1000000, digits = 0),
IMP=round(BM.GSR.TOTL.CD/1000000, digits = 0))%>%
mutate(SOLDE=(EXP-IMP))%>%select(Année, EXP, IMP, SOLDE)%>%tidyr::gather(Indicateur, Montant, EXP:SOLDE)
head(EXP_IMP5)%>%
kbl(caption = "Tableau final après traitement") %>%
kable_classic(full_width = F, html_font = "Cambria")
| Année | Indicateur | Montant |
|---|---|---|
| 1977 | EXP | 971 |
| 1978 | EXP | 1302 |
| 1979 | EXP | 1706 |
| 1980 | EXP | 2058 |
| 1981 | EXP | 1800 |
| 1982 | EXP | 1785 |
On obtient les graphiques suivants:
color <- ifelse(EXP_IMP2$Situation_BC == "Déficit", "#832161", "#202020")
ggplot(EXP_IMP2, aes(Année, Surplus_Deficit))+
geom_bar(stat = "identity", position = "dodge",fill = color, color = "white") +
scale_y_continuous(labels = unit_format(unit = "M", prefix = "$"))+
ggtitle(label=expression(paste(bold(underline("Visualisation 3:")),bold("graphique Déficit/Excédant à barres"))),
subtitle ="(Depuis 1977, le Cameroun a toujours eu un solde commercial déficitaire sauf en 1995)")+
labs(fill=NULL, caption = expression(paste(italic(underline("Source:")),italic(" Données issues de 'WDI_data' du package de R (Banque Mondiale)"))))+
Conrad_Theme()
ggplot(EXP_IMP5, aes(Année, Montant, fill = Indicateur))+
geom_bar(stat = "identity", position = "dodge" , color = "white")+
scale_y_continuous(labels = unit_format(unit = "K", scale = 1e-09, prefix = "$"))+
scale_fill_manual(values= c("#832161", "#202020", "#FFD100"))+
ggtitle(label=expression(paste(bold(underline("Visualisation 4:")),bold("graphique Déficit/Excédant à barres"))),
subtitle ="(Le Cameroun est un pays qui dépend fortement de l'extérieur et donc très exposé aux fluctuation des cours mondiaux et aux crises)")+
labs(fill=NULL, caption = expression(paste(italic(underline("Source:")),italic(" Données issues de 'WDI_data' du package de R (Banque Mondiale)"))))+
Conrad_Theme()
### II-1-4 Le graphique Déficit/Excédant en surface
Pour des besoins d’apprentissage nous allons un peu manipuler les données ci-dessus pour créer des valeur fictives des surplus en ajoutant 500 000 000 de dollars US à chacune des valeurs précédentes.
EXP_IMP3<-EXP_IMP2%>%
mutate(Surplus_Deficit2=Surplus_Deficit+500)%>%
mutate(Situation_BC2=if_else(Surplus_Deficit2>0,"Excédant", "Déficit"))%>%
select(Année, Surplus_Deficit2, Situation_BC2)
head(EXP_IMP3)%>%
kbl(caption = "Tableau final après traitement") %>%
kable_classic(full_width = F, html_font = "Cambria")
| Année | Surplus_Deficit2 | Situation_BC2 |
|---|---|---|
| 1977 | -132692603 | Déficit |
| 1978 | -203716789 | Déficit |
| 1979 | -138161275 | Déficit |
| 1980 | -493184938 | Déficit |
| 1981 | -505204174 | Déficit |
| 1982 | -393479536 | Déficit |
On obtient le graphique suivant:
ggplot(data = EXP_IMP3, aes(x = Année, y = Surplus_Deficit2)) +
geom_line(color="white", size=2) +
geom_hline(yintercept = 0) + #deficit ribbon below
geom_ribbon(aes(ymin = ifelse(Surplus_Deficit2 < 0, Surplus_Deficit2, 0),
ymax = 0,
fill = "Déficit")) +
geom_ribbon(aes(ymin = 0,
ymax = ifelse(Surplus_Deficit2 > 0, Surplus_Deficit2, 0),
fill = "Excédant")) +
scale_y_continuous(labels = unit_format(unit = "K", scale = 1e-09, prefix = "$"))+
scale_fill_manual(values=c("#202020", "#FFD100"))+
ggtitle(label=expression(paste(bold(underline("Visualisation 5:")),bold("graphique Déficit/Excédant à barres"))),
subtitle ="(Evolution des profits et pertes annuelles)")+
labs(fill=NULL, caption = expression(paste(italic(underline("Source:")),italic(" Données Fictives pour illustrer un cas d'école"))))+
Conrad_Theme()
Le spline est un type de graphique qui divise une seule valeur en 2 composants contrastés (par exemple Homme/Femme). il ressemble au graphique à barre divergentes mais contrairement à ce dernier, les valeurs représentées sont relatives et les positifs (respectivement négatifs) ne sont pas groupés entre eux.
Préparation des données
H_F <- WDI(
country = c("CMR", "GAB", "CAF", "CG", "GQ"),
indicator = c("BI.EMP.PWRK.PB.FE.ZS", "BI.EMP.PWRK.PB.MA.ZS"), #Exportations & importation of goods and services
start = 1960,
end = 2022,
extra = FALSE,
cache = NULL,
latest = NULL,
language = "en"
)
H_F2<-H_F%>%mutate(FEMME=round(runif(nrow(H_F), min=40, max=49), digits=2))%>%
mutate(HOMME=100-FEMME)%>%select(year, country, FEMME, HOMME)%>%filter(year==max(year))%>%
tidyr::gather(genre, Proportion, FEMME:HOMME)%>%
mutate(Taux_Femme = ifelse(genre == "HOMME",
Proportion,
-1*Proportion))%>%
select(country, genre, Proportion, Taux_Femme)
head(H_F2)%>%
kbl(caption = "Tableau final après traitement") %>%
kable_classic(full_width = F, html_font = "Cambria")
| country | genre | Proportion | Taux_Femme |
|---|---|---|---|
| Cameroon | FEMME | 41.12 | -41.12 |
| Central African Republic | FEMME | 41.41 | -41.41 |
| Congo | FEMME | 45.40 | -45.40 |
| Equatorial Guinea | FEMME | 40.77 | -40.77 |
| Gabon | FEMME | 40.98 | -40.98 |
| Cameroon | HOMME | 58.88 | 58.88 |
On obtient le graphique suivant:
Seuil_valeur <- pretty(H_F2$Taux_Femme)
ggplot(H_F2, aes(x = country, y = Taux_Femme, fill=genre)) +
geom_hline(yintercept = 0)+
geom_bar(stat = "identity", # Background color
show.legend = TRUE,
color = "white") +
scale_y_continuous(breaks = Seuil_valeur,
labels = abs(Seuil_valeur))+
geom_text(aes(label = paste(Proportion, "%", sep="")), position = position_stack(vjust = 0.5),
size = 4, color="white") +
ggtitle(label=expression(paste(bold(underline("Visualisation 5:")),bold("graphique Spline"))),
subtitle ="(Le genre dans l'administration en Afrique Centrale en 2020)")+
labs(x="Pays", y="Genre dans l'ADM", caption = expression(paste(italic(underline("Source:")),italic(" Données issues de 'WDI_data' du package WDI de R, Banque Mondiale"))))+
coord_flip()+
Conrad_Theme()+
scale_fill_manual(values = c("#202020", "#FFD100"))
Ces graphiques servent à montrer la relation entre deux variables ou plus. Gardez à l’esprit que, à moins que vous ne leur disiez le contraire, de nombreux lecteurs supposeront que les relations que vous leur montrez sont causales (c’est-à-dire que l’une cause l’autre).
C’est la manière standard de montrer la relation entre deux variables quantitatives.
La base de données Iris est utilisée à cet effet
head(iris)%>%
kbl(caption = "Base de données Iris") %>%
kable_classic(full_width = F, html_font = "Cambria")
| Sepal.Length | Sepal.Width | Petal.Length | Petal.Width | Species |
|---|---|---|---|---|
| 5.1 | 3.5 | 1.4 | 0.2 | setosa |
| 4.9 | 3.0 | 1.4 | 0.2 | setosa |
| 4.7 | 3.2 | 1.3 | 0.2 | setosa |
| 4.6 | 3.1 | 1.5 | 0.2 | setosa |
| 5.0 | 3.6 | 1.4 | 0.2 | setosa |
| 5.4 | 3.9 | 1.7 | 0.4 | setosa |
On en deduit le nuage de points ci-dessous
iris%>%ggplot(aes(Sepal.Length - 5, Sepal.Width - 2, col = Species)) +
geom_quadrant_lines(linetype = "solid") +
geom_point()+
ggtitle(label=expression(paste(bold(underline("Visualisation 1:")),bold("Nuage de points"))),
subtitle ="(Correlation entre la largeur et la longueur de Sépales des épices)")+
labs(x="Pays", y="Genre dans l'ADM", caption = expression(paste(italic(underline("Source:")),italic(" Données issues de données classique 'IRIS' de R"))))+
Conrad_Theme()
C’est Un bon moyen de montrer la relation dans le temps entre un montant (colonnes) et un taux (ligne)
Présentation des données
year <- c(2014, 2015, 2016, 2017, 2018, 2019,2020)
course <- c(35, 30, 40, 25, 30, 35, 65)
penroll <- c(0.3, 0.25, 0.3, 0.5, 0.4, 0.2, 0.6)
perf <- data.frame(year, course, penroll)
head(perf)%>%
kbl(caption = "Choix cours optionnel 2014-2020") %>%
kable_classic(full_width = F, html_font = "Cambria")
| year | course | penroll |
|---|---|---|
| 2014 | 35 | 0.30 |
| 2015 | 30 | 0.25 |
| 2016 | 40 | 0.30 |
| 2017 | 25 | 0.50 |
| 2018 | 30 | 0.40 |
| 2019 | 35 | 0.20 |
On en déduit le graphique à barres et courbe ci-dessous
ggp <- ggplot(perf) +
geom_bar(aes(x=year, y=course),stat="identity", fill="#202020",colour="white")+
geom_text(aes(label=penroll, x=year, y=course*1.2), colour="black")+
geom_text(aes(label=course, x=year, y=2), colour="white")+
geom_line(aes(x=year, y=100*penroll),stat="identity",color="#FFD100",size=2)+
ggtitle(label=expression(paste(bold(underline("Visualisation 2:")),bold("Barre et Courbe"))),
subtitle ="(Proportion d'édudiants inscrits à un cours optionnel)")+
labs(caption = expression(paste(italic(underline("Source:")),italic(" Données Fictives"))))+
scale_y_continuous(sec.axis=sec_axis(
~.*0.01,name="% inscrits", labels=scales::percent))+
labs(x="Année",y="Effectif Total")+
Conrad_Theme()
ggp
Il est habituellement utilisé pour montrer comment la relation entre 2 variables quatitatives a changé au fil du temps
Présentation des données
x <- c(1, 2, 3, 4, 5, 4, 7, 8, 9)
y <- c(12, 16, 14, 18, 16, 13, 15, 20, 22)
labels <- 2013:2021
df <- data.frame(x, y, labels = labels)
head(df)%>%
kbl(caption = "Evolution entre X et Y 2013-2021") %>%
kable_classic(full_width = F, html_font = "Cambria")
| x | y | labels |
|---|---|---|
| 1 | 12 | 2013 |
| 2 | 16 | 2014 |
| 3 | 14 | 2015 |
| 4 | 18 | 2016 |
| 5 | 16 | 2017 |
| 4 | 13 | 2018 |
On en déduit le graphique à barres et courbe ci-dessous
ggplot(df, aes(x = x, y = y)) +
geom_path(color = 4, arrow = arrow()) +
geom_point(size = 2, color = 4) +
geom_text(aes(label = labels, x = x + 0.7, y = y))+
ggtitle(label=expression(paste(bold(underline("Visualisation 3:")),bold("Le Graphique Nuage de points reliés par un ittinéraire"))),
subtitle ="(Y connait une grande croissance à partir de 2019)")+
labs(caption = expression(paste(italic(underline("Source:")),italic(" Données Fictives"))))+
Conrad_Theme()
Comme un nuage de points, il permet de voir les correlations entre 2 variables quantitatives mais, ajoute des détails supplémentaires en dimensionnant les cercles en fonction d’une troisième variable quantitative et en les coloriant en fonction de la quatrième variable (qualitative)
Présentation des données
library(gapminder)
data <- gapminder %>% filter(year=="2007") %>% dplyr::select(-year)
head(data)%>%
kbl(caption = "Gapminder 2007") %>%
kable_classic(full_width = F, html_font = "Cambria")
| country | continent | lifeExp | pop | gdpPercap |
|---|---|---|---|---|
| Afghanistan | Asia | 43.828 | 31889923 | 974.5803 |
| Albania | Europe | 76.423 | 3600523 | 5937.0295 |
| Algeria | Africa | 72.301 | 33333216 | 6223.3675 |
| Angola | Africa | 42.731 | 12420476 | 4797.2313 |
| Argentina | Americas | 75.320 | 40301927 | 12779.3796 |
| Australia | Oceania | 81.235 | 20434176 | 34435.3674 |
On en déduit le graphique à bulles ci-dessous
data %>%
arrange(desc(pop)) %>%
mutate(country = factor(country, country)) %>%
ggplot(aes(x=gdpPercap, y=lifeExp, size=pop, fill=continent)) +
geom_point(alpha=0.5, shape=21, color="black") +
Conrad_Theme() +
theme(legend.position="bottom") +
ylab("Expérance de Vie") +
xlab("Revenu par Tête") +
theme(legend.position = "left")+
ggtitle(label=expression(paste(bold(underline("Visualisation 4:")),bold("Le Graphique à bulles"))),
subtitle ="(Le revenu est positivement lié à l'espérance de vie)")+
labs(caption = expression(paste(italic(underline("Source:")),italic(" Données Fictives"))))
C’est un bon moyen de montrer les modèles entre 2 catégories de données, il est moins bon pour montrer les différences fines (de faible ampleur) dans les quantités. il est plus recommendé de l’utiliser entre 2 Variables qualitatives ou entre une qualitative et une quandtitative.
Présentation des données
set.seed(328576)
data2 <- data.frame(group1 = rep(LETTERS[1:4], each = 10),
group2 = letters[1:10],
values = round(rnorm(40), 2))
head(data2)%>%
kbl(caption = "Maj_Minus") %>%
kable_classic(full_width = F, html_font = "Cambria")
| group1 | group2 | values |
|---|---|---|
| A | a | -0.52 |
| A | b | -0.06 |
| A | c | -1.63 |
| A | d | 1.22 |
| A | e | -0.94 |
| A | f | 0.65 |
On en déduit le graphique carte de chaleur ci-dessous
data2 %>%ggplot(aes(group1, group2)) + # Create default ggplot2 heatmap
geom_tile(aes(fill = values))+
geom_text(aes(label = values))+
geom_text(aes(label = values))+
ggtitle(label=expression(paste(bold(underline("Visualisation 5:")),bold("Le Graphique Carte de chaleur"))),
subtitle ="(Relation entre les Majuscules et les Minuscules)")+
labs(caption = expression(paste(italic(underline("Source:")),italic(" Données Fictives"))))
Ici vous cherchez à montrez comment une seule entité peut être décomposée en ses éléments composants. Si l’intérêt du lecteur est uniquement dans la taille des composants, considérez plutôt un tableau de type magnitude
Un hémicycle/parlement est souvent utilisé pour visualiser les résultats politiques. De manière beaucoup plus pratique, il peut servir à présenter des proportions.
les données utilisées sont les suivantes
library(ggparliament)
ru <- election_data %>%
filter(country == "Russia" & year == 2016)
ru_semicircle <- parliament_data(election_data=ru,
type = "semicircle",
parl_rows = 10,
party_seats = ru$seats)
head(ru_semicircle)%>%
kbl(caption = "Parlement") %>%
kable_classic(full_width = F, html_font = "Cambria")
| year | country | house | party_long | party_short | seats | government | colour | x | y | row | theta | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 1 | 2016 | Russia | Duma | Communist | CPRF | 42 | 0 | #D50000 | -2.000000 | 0 | 10 | 3.141593 |
| 1.1 | 2016 | Russia | Duma | Communist | CPRF | 42 | 0 | #D50000 | -1.888889 | 0 | 9 | 3.141593 |
| 1.2 | 2016 | Russia | Duma | Communist | CPRF | 42 | 0 | #D50000 | -1.777778 | 0 | 8 | 3.141593 |
| 1.3 | 2016 | Russia | Duma | Communist | CPRF | 42 | 0 | #D50000 | -1.666667 | 0 | 7 | 3.141593 |
| 1.4 | 2016 | Russia | Duma | Communist | CPRF | 42 | 0 | #D50000 | -1.555556 | 0 | 6 | 3.141593 |
| 1.5 | 2016 | Russia | Duma | Communist | CPRF | 42 | 0 | #D50000 | -1.444444 | 0 | 5 | 3.141593 |
On en déduit le graphique suivant
ru_semicircle <- parliament_data(election_data = ru,
type = "semicircle",
parl_rows = 10,
party_seats = ru$seats)
ggplot(ru_semicircle, aes(x = x, y = y, colour = party_short)) +
geom_parliament_seats() +
draw_partylabels(type = "semicircle",
party_names = party_long,
party_seats = seats,
party_colours = colour) +
draw_totalseats(n = 450, type = "semicircle") +
Conrad_Theme() +
labs(title = "Russia, 2016") +
scale_colour_manual(values = ru_semicircle$colour,
limits = ru_semicircle$party_short)
Group1 <-c("Sindi","Kevin")
Group2 <-c("Michèle","Junior")
Group3 <-c("Roger","Jean")
Group4 <-c("Guy-Martial","Georges")
Group5 <-c("Romaric","Kantin", "Christian")
Group6 <-c("Wilfried","Bonaventure")
Group7 <-c("Jovita","Ralf")
Group8 <-c("Epiphanie","Vidal")
library(kableExtra)
set.seed(1132023)
Group<-c(1, 2, 3, 4, 5, 6, 7, 8)
Chapitre <-data.frame(c("Correlation", "Ranking", "Distribution", "Change_Over_Time",
"Magnitude", "Part_Of_Whole", "Spatial", "Flow"))
names(Chapitre)<-c("Chapitre_CC")
Chapitre$Group<-print(sample(Group,8,replace=FALSE))
## [1] 8 4 7 1 5 6 3 2
Chapitre%>%
kbl(caption = "Répartition des groupe CC") %>%
kable_classic(full_width = F, html_font = "Cambria")
| Chapitre_CC | Group |
|---|---|
| Correlation | 8 |
| Ranking | 4 |
| Distribution | 7 |
| Change_Over_Time | 1 |
| Magnitude | 5 |
| Part_Of_Whole | 6 |
| Spatial | 3 |
| Flow | 2 |
library(leaflet)
library(raster)
library(sf)
library(sp)
library(dplyr)
CMR1 <- getData('GADM', country='CMR', level=1)
is(CMR1)
## [1] "SpatialPolygonsDataFrame" "SpatialPolygons"
## [3] "Spatial" "SpatialVector"
CMR1sf = st_as_sf(CMR1)
library(readr)
Population <- read_csv("D:/Population.csv")
Population2<-Population%>%mutate(NAME_1=case_when(
Region=="Adamaoua" ~ "Adamaoua",
Region=="Centre" ~ "Centre",
Region=="Est" ~ "Est",
Region=="Extr\xeame-Nord" ~ "Extrême-Nord",
Region=="Littoral" ~ "Littoral",
Region=="Nord" ~ "Nord",
Region=="Nord-Ouest" ~ "Nord-Ouest",
Region=="Ouest" ~ "Ouest",
Region=="Sud" ~ "Sud",
Region=="Sud-Ouest" ~ "Sud-Ouest",
Region=="Cameroun" ~ "CMR",
TRUE ~ "Extrême-Nord"
))
CMR1sf2<-left_join(CMR1sf, Population2, by="NAME_1")
pal <- colorBin(
palette = "viridis",
domain = CMR1sf2$Population,
reverse = TRUE,
# Echelle avec des quantiles sinon Paris prend toute la place...
bins = quantile(
CMR1sf2$Population,
probs = seq(0, 1, by = 0.2)))
map_regions <- leaflet() %>%
addTiles() %>%
# polygone des regions
addPolygons(
data = CMR1sf2,
label = ~NAME_1,
popup = ~paste0("Pop : ", Population, " Individus"),
fill = TRUE,
fillColor = ~pal(Population),
fillOpacity = 0.8,
highlightOptions = highlightOptions(color = "white", weight = 2))%>%
addLegend(
title = "Population par Région",
pal = pal, values = CMR1sf2$Population)
map_regions