Alors que seules quelques lignes sont nécessaires pour tracer des histogrammes multiples / superposés dans ggplot2, les résultats ne sont pas toujours satisfaisants. Il faut utiliser correctement les bordures et la coloration pour s'assurer que l'œil peut différencier les histogrammes .
Les fonctions suivantes équilibrent les couleurs de bordure, les opacités et les graphiques de densité superposés pour permettre au spectateur de différencier les distributions .
Histogramme unique :
plot_histogram <- function(df, feature) {
plt <- ggplot(df, aes(x=eval(parse(text=feature)))) +
geom_histogram(aes(y = ..density..), alpha=0.7, fill="#33AADE", color="black") +
geom_density(alpha=0.3, fill="red") +
geom_vline(aes(xintercept=mean(eval(parse(text=feature)))), color="black", linetype="dashed", size=1) +
labs(x=feature, y = "Density")
print(plt)
}
Histogramme multiple :
plot_multi_histogram <- function(df, feature, label_column) {
plt <- ggplot(df, aes(x=eval(parse(text=feature)), fill=eval(parse(text=label_column)))) +
geom_histogram(alpha=0.7, position="identity", aes(y = ..density..), color="black") +
geom_density(alpha=0.7) +
geom_vline(aes(xintercept=mean(eval(parse(text=feature)))), color="black", linetype="dashed", size=1) +
labs(x=feature, y = "Density")
plt + guides(fill=guide_legend(title=label_column))
}
Utilisation :
Passez simplement votre bloc de données dans les fonctions ci-dessus avec les arguments souhaités:
plot_histogram(iris, 'Sepal.Width')
plot_multi_histogram(iris, 'Sepal.Width', 'Species')
Le paramètre supplémentaire dans plot_multi_histogram est le nom de la colonne contenant les étiquettes de catégorie.
Nous pouvons voir cela de manière plus spectaculaire en créant un dataframe avec de nombreux moyens de distribution différents :
a <-data.frame(n=rnorm(1000, mean = 1), category=rep('A', 1000))
b <-data.frame(n=rnorm(1000, mean = 2), category=rep('B', 1000))
c <-data.frame(n=rnorm(1000, mean = 3), category=rep('C', 1000))
d <-data.frame(n=rnorm(1000, mean = 4), category=rep('D', 1000))
e <-data.frame(n=rnorm(1000, mean = 5), category=rep('E', 1000))
f <-data.frame(n=rnorm(1000, mean = 6), category=rep('F', 1000))
many_distros <- do.call('rbind', list(a,b,c,d,e,f))
Passer le bloc de données comme avant (et élargir le graphique à l'aide d'options):
options(repr.plot.width = 20, repr.plot.height = 8)
plot_multi_histogram(many_distros, 'n', 'category')