Bien que quelques lignes seulement soient nécessaires pour tracer des histogrammes multiples ou superposés dans ggplot2, les résultats ne sont pas toujours satisfaisants. Il faut utilisation appropriée des bordures et des couleurs pour que l'œil puisse différencier les histogrammes .
Les fonctions suivantes équilibrent couleurs des bordures, opacités et tracés de densité superposés pour permettre au spectateur de différencier les distributions .
Histogramme simple :
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 :
Tout simplement passer votre cadre de données dans les fonctions ci-dessus ainsi que les arguments souhaités :
plot_histogram(iris, 'Sepal.Width')
![enter image description here]()
plot_multi_histogram(iris, 'Sepal.Width', 'Species')
![enter image description here]()
El paramètre supplémentaire dans plot_multi_histogram est le nom de la colonne contenant les étiquettes des catégories.
Nous pouvons voir cela de manière plus spectaculaire en créant un cadre de données 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))
Passage du cadre de données comme précédemment (et élargissement du graphique en utilisant les options) :
options(repr.plot.width = 20, repr.plot.height = 8)
plot_multi_histogram(many_distros, 'n', 'category')
![enter image description here]()
Pour ajouter un ligne verticale séparée pour chaque distribution :
plot_multi_histogram <- function(df, feature, label_column, means) {
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(xintercept=means, color="black", linetype="dashed", size=1)
labs(x=feature, y = "Density")
plt + guides(fill=guide_legend(title=label_column))
}
Le seul changement par rapport au précédent plot_multi_histogramme est l'addition de means
aux paramètres, et en modifiant les geom_vline
pour accepter des valeurs multiples.
Utilisation :
options(repr.plot.width = 20, repr.plot.height = 8)
plot_multi_histogram(many_distros, "n", 'category', c(1, 2, 3, 4, 5, 6))
Résultat :
![enter image description here]()
Puisque j'ai défini les moyens explicitement dans many_distros
Je peux simplement les faire passer. Vous pouvez également les calculer dans la fonction et les utiliser de cette façon.
4 votes
Les hyperliens vers l'histogramme et le graphique de densité sont rompus.