web-dev-qa-db-fra.com

Superposition d'histogrammes avec ggplot2 dans R

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!

112
Bloomy

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:

enter image description here

Édité pour corriger les fautes de frappe; vous vouliez remplir, pas la couleur.

109
joran

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:

docs.ggplot2.org/current/geom_histogram.html

214
kohske

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')

enter image description here

plot_multi_histogram(iris, 'Sepal.Width', 'Species')

enter image description here

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')

enter image description here

6
Cybernetic