Joseph Larmarange, Ceped IRD
Rencontres de statistique appliquée, Ined, 18 juin 2018
R dispose d'un puissant moteur graphique interne.
Exemples en ligne : https://www.r-graph-gallery.com/
Fonctions graphiques de base :
Heureusement, il existe de nombreuses extensions graphiques pour R, dont (liste non exhaustive)
Le concept de tidy data repose sur trois règles interdépendantes.
Des données sont considérées comme tidy si :
pays | 1992 | 1997 | 2002 | 2007 |
---|---|---|---|---|
Belgium | 10045622 | 10199787 | 10311970 | 10392226 |
France | 57374179 | 58623428 | 59925035 | 61083916 |
Germany | 80597764 | 82011073 | 82350671 | 82400996 |
pays | annee | population |
---|---|---|
Belgium | 1992 | 10045622 |
France | 1992 | 57374179 |
Germany | 1992 | 80597764 |
Belgium | 1997 | 10199787 |
France | 1997 | 58623428 |
Germany | 1997 | 82011073 |
Belgium | 2002 | 10311970 |
France | 2002 | 59925035 |
Germany | 2002 | 82350671 |
Belgium | 2007 | 10392226 |
France | 2007 | 61083916 |
Germany | 2007 | 82400996 |
La grammaire des graphiques invite l’utilisateur à repenser sa manière de concevoir un graphique en associant variables (données), paramètres graphiques (esthétiques) et formes géométriques, puis en complexifiant progressivement son graphique (coordonnées, échelles, facettes, étiquettes, légendes, thèmes…).
Extrait des données du recensement français de 1999.
Une ligne par commune du département du Rhônes.
nom | tx.chom | dipl.aucun | pop.tot | commune.ouvriere |
---|---|---|---|---|
AFFOUX | 3.539823 | 23.91304 | 248 | oui |
AIGUEPERSE | 7.777778 | 25.00000 | 233 | oui |
ALBIGNY-SUR-SAONE | 10.407632 | 24.97721 | 2680 | non |
ALIX | 4.693141 | 12.06294 | 690 | oui |
AMBERIEUX | 7.042254 | 24.15902 | 427 | oui |
Variables : taux de chômage, proportion de la population adulte n'ayant aucun diplôme, population totale, commune considérée comme ouvrière (si plus d'un quart de la population active est ouvrière).
library(ggplot2)
p <- ggplot(rp99) +
aes(x = dipl.aucun, y = tx.chom) +
geom_point()
A minima, ggplot2 nécessite :
(i) des données ;
(ii) l'association entre des variables et des esthétiques
(iii) une géométrie.
Note : ggplot2 repose sur une syntaxe additive.
p <- ggplot(rp99) +
aes(x = dipl.aucun, y = tx.chom, colour = commune.ouvriere, size = pop.tot) +
geom_point(alpha = .5)
Note : il est possible de fixer la valeur d'une esthétique non associée à une variable, lors de l'appel à une géométrie.
Note 2: les variables catégorielles doivent être sous forme de facteurs.
p <- ggplot(rp99) +
aes(x = dipl.aucun, y = tx.chom, colour = commune.ouvriere, size = pop.tot) +
geom_smooth(method = "lm", show.legend = FALSE) +
geom_point(alpha = .5)
Note : les géométries sont associées à une statistique (ici, à une fonction calculant la droite de régression). Nous y reviendrons plus tard.
Les échelles permettent de contrôler le rendu des esthétiques.
p <- p +
scale_x_continuous(limits = c(0, 45)) +
scale_y_continuous(breaks = c(0, 2, 4, 6, 8, 10, 15, 20, 25)) +
scale_color_brewer(palette = "Set1") +
scale_size_area()
p <- p +
coord_equal()
p <- p +
ggtitle("Lien entre taux de chômage et éducation", subtitle = "Département du Rhônes, 1999") +
xlab("Proportion des actifs sans diplôme") +
ylab("Taux de chômage") +
labs(size = "Population totale", colour = "Commune ouvrière ?")
library(hrbrthemes)
p <- p +
theme_ipsum_rc() +
theme(
legend.position = "bottom",
legend.box = "vertical"
)
Note : certaines extensions comme hrbrthemes étendent ggplot2 en proposant, par exemple, des thèmes additionnels.
Les données sont issues d'un sous-échantillon de l'enquête Histoire de vie 2003 de l'Insee.
library(hrbrthemes)
p <- ggplot(hdv2003) +
aes(x = csp) +
geom_bar()
Note : par défaut, la géométrie geom_bar()
appelle la statistique stat_count()
, qui calcule les effectifs de chaque sous-groupe, et les associe à l'esthétique y
.
p <- ggplot(hdv2003) +
aes(x = csp, fill = sport) +
geom_bar()
p <- ggplot(hdv2003) +
aes(x = csp, fill = sport) +
geom_bar(position = "dodge")
p <- ggplot(hdv2003) +
aes(x = csp, fill = sport) +
geom_bar(position = "fill")
library(scales)
p <- p +
scale_y_continuous(label = percent)
Note : voir l'extension scales et en particulier la fonction number_format()
pour la mise en forme des nombres.
p <- p +
facet_grid(sexe ~ groupe_ages)
p <- p +
coord_flip()
p <- p +
geom_text(
aes(label = ..count..),
stat = "count",
position = position_fill(.5)
)
p1 <- ggplot(mtcars, aes(wt, mpg)) + geom_point()
p2 <- ggplot(mtcars, aes(factor(cyl))) + geom_bar()
p3 <- ggplot(mtcars, aes(factor(cyl), mpg)) + geom_violin()
p4 <- ggplot(mtcars, aes(factor(cyl), mpg)) + geom_boxplot()
library(cowplot)
plot_grid(
p1, p2, p3, p4,
ncol = 2,
align = "hv",
rel_heights = c(2, 1),
rel_widths = c(1, 2)
)
ggsave("mon_graphique.pdf", plot = p, width = 11, height = 8, units = "cm")
Formats d'export:
Il existe un grand nombre d'extensions disponibles permettant d'étendre les possibilités de ggplot2.
geom_lollipop()
de l'extension ggalt.
geom_dumbbell()
de l'extension ggalt.
geom_pirate()
de l'extension ggpirate.
p <- ggplot(iris) + aes(x = Petal.Width, y = Sepal.Length, color = Species) +
geom_point()
library(plotly)
ggplotly(p)
Pour voir le rendu : https://larmarange.github.io/seminaire-INED-18juin2019/exemple_graphique_interactif.html
library(gganimate)
library(gapminder)
ggplot(gapminder) +
aes(gdpPercap, lifeExp, size = pop, colour = country)) +
geom_point(alpha = 0.7, show.legend = FALSE) +
scale_colour_manual(values = country_colors) +
scale_size(range = c(2, 12)) +
scale_x_log10() +
facet_wrap(~ continent) +
# Here comes the gganimate specific bits
labs(title = "Year: {frame_time}", x = "GDP per capita", y = "life expectancy") +
transition_time(year) +
ease_aes("linear")
Retrouvez le code source de ce diaporama sur https://github.com/larmarange/seminaire-INED-18juin2019