Je suis nouveau sur R et j'essaie de tracer 3 histogrammes sur le même graphique. Tout a bien fonctionné, mais mon problème est que vous ne voyez pas où 2 histogrammes se chevauchent - ils semblent plutôt coupés: Histogramme
Lorsque je fais des tracés de densité, cela a l'air parfait: chaque courbe est entourée d'une ligne de cadre noire et les couleurs ont un aspect différent lorsque les courbes se chevauchent: Tracé de densité
Quelqu'un peut-il me dire s'il est possible d'obtenir quelque chose de similaire avec les histogrammes de la 1ère image? C'est le code que j'utilise:
lowf0 <-read.csv (....)
mediumf0 <-read.csv (....)
highf0 <-read.csv(....)
lowf0$utt<-'low f0'
mediumf0$utt<-'medium f0'
highf0$utt<-'high f0'
histogram<-rbind(lowf0,mediumf0,highf0)
ggplot(histogram, aes(f0, fill = utt)) + geom_histogram(alpha = 0.2)
Merci d'avance pour tous conseils utiles!
Votre code actuel:
ggplot(histogram, aes(f0, fill = utt)) + geom_histogram(alpha = 0.2)
dit à ggplot
de construire n histogramme en utilisant toutes les valeurs de f0
puis coloriez les barres de cet unique histogramme en fonction de la variable utt
.
Au lieu de cela, vous voulez créer trois histogrammes distincts, avec un fondu alpha afin qu’ils soient visibles les uns par rapport aux autres. Donc, vous voulez probablement utiliser trois appels distincts à geom_histogram
, où chacun obtient son propre cadre de données et remplit:
ggplot(histogram, aes(f0)) +
geom_histogram(data = lowf0, fill = "red", alpha = 0.2) +
geom_histogram(data = mediumf0, fill = "blue", alpha = 0.2) +
geom_histogram(data = highf0, fill = "green", alpha = 0.2) +
Voici un exemple concret avec quelques résultats:
dat <- data.frame(xx = c(runif(100,20,50),runif(100,40,80),runif(100,0,30)),yy = rep(letters[1:3],each = 100))
ggplot(dat,aes(x=xx)) +
geom_histogram(data=subset(dat,yy == 'a'),fill = "red", alpha = 0.2) +
geom_histogram(data=subset(dat,yy == 'b'),fill = "blue", alpha = 0.2) +
geom_histogram(data=subset(dat,yy == 'c'),fill = "green", alpha = 0.2)
qui produit quelque chose comme ceci:
Édité pour corriger les fautes de frappe; vous vouliez remplir, pas la couleur.
En utilisant les exemples de données de @ joran,
ggplot(dat, aes(x=xx, fill=yy)) + geom_histogram(alpha=0.2, position="identity")
notez que la position par défaut de geom_histogram
est "pile".
voir "réglage de la position" de cette page:
Bien que quelques lignes soient nécessaires pour tracer des histogrammes multiples/chevauchants dans ggplot2, les résultats ne sont pas toujours satisfaisants. Il est nécessaire d’utiliser correctement les bordures et la coloration pour que l’œil puisse différencier les histogrammes .
Les fonctions suivantes permettent d’équilibrer les couleurs de bordure, les opacités et les tracés de densité superposés afin de permettre au visualiseur 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 :
Simplement passez votre trame 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 de plot_multi_histogram est le nom de la colonne contenant les étiquettes de catégorie.
Nous pouvons le voir 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))
Passer le bloc de données comme auparavant (et élargir le graphique à l'aide des options):
options(repr.plot.width = 20, repr.plot.height = 8)
plot_multi_histogram(many_distros, 'n', 'category')