faire des facettes dans ggplot Je voudrais souvent que le pourcentage soit utilisé à la place du nombre.
par exemple.
test1 <- sample(letters[1:2], 100, replace=T)
test2 <- sample(letters[3:8], 100, replace=T)
test <- data.frame(cbind(test1,test2))
ggplot(test, aes(test2))+geom_bar()+facet_grid(~test1)
C'est très facile, mais si N est différent dans la facette A par rapport à la facette B, il serait préférable, je pense, de comparer les pourcentages, de manière à ce que chaque facette soit égale à 100%.
comment y arriverais-tu?
J'espère que ma question a du sens.
Cordialement.
Essaye ça:
# first make a dataframe with frequencies
df <- as.data.frame(with(test, table(test1,test2)))
# or with count() from plyr package as Hadley suggested
df <- count(test, vars=c('test1', 'test2'))
# next: compute percentages per group
df <- ddply(df, .(test1), transform, p = Freq/sum(Freq))
# and plot
ggplot(df, aes(test2, p))+geom_bar()+facet_grid(~test1)
Vous pouvez également ajouter + scale_y_continuous(formatter = "percent")
au tracé pour ggplot2 version 0.8.9 ou + scale_y_continuous(labels = percent_format())
pour la version 0.9.0.
Voici une méthode dans ggplot
, utilisant ..count..
et ..PANEL..
:
ggplot(test, aes(test2)) +
geom_bar(aes(y = (..count..)/tapply(..count..,..PANEL..,sum)[..PANEL..])) +
facet_grid(~test1)
Comme cela est calculé à la volée, il devrait être robuste aux changements de paramètres de tracé.
Un moyen très simple:
ggplot(test, aes(test2)) +
geom_bar(aes(y = (..count..)/sum(..count..))) +
facet_grid(~test1)
J'ai donc uniquement changé le paramètre de geom_bar en aes(y = (..count..)/sum(..count..))
. Après avoir défini ylab sur NULL et spécifié le formateur, vous pourriez obtenir:
ggplot(test, aes(test2)) +
geom_bar(aes(y = (..count..)/sum(..count..))) +
facet_grid(~test1) +
scale_y_continuous('', formatter="percent")
Update Notez que bien que formatter = "percent")
fonctionne pour ggplot2 version 0.8.9, dans la version 0.9.0, vous voudriez quelque chose comme scale_y_continuous(labels = percent_format())
.
Voici une solution qui devrait vous faire avancer dans la bonne direction. Je suis curieux de voir s'il existe des moyens plus efficaces de procéder, car cela semble un peu hacky et compliqué. Nous pouvons utiliser l'argument ..density..
intégré pour le y aesthetic
, mais les facteurs ne fonctionnent pas là. Nous devons donc également utiliser scale_x_discrete
pour étiqueter correctement l’axe une fois que nous avons converti test2
en objet numérique.
ggplot(data = test, aes(x = as.numeric(test2)))+
geom_bar(aes(y = ..density..), binwidth = .5)+
scale_x_discrete(limits = sort(unique(test$test2))) +
facet_grid(~test1) + xlab("Test 2") + ylab("Density")
Mais faites un tourbillon et dites-moi ce que vous en pensez.
En outre, vous pouvez raccourcir la création de vos données de test comme ceci, ce qui évite les objets supplémentaires dans votre environnement et les oblige à les regrouper:
test <- data.frame(
test1 = sample(letters[1:2], 100, replace = TRUE),
test2 = sample(letters[3:8], 100, replace = TRUE)
)
Je fais souvent face à des situations similaires, mais adopte une approche très différente qui utilise deux des autres packages de Hadley, à savoir reshape et plyr. Principalement parce que j'ai une préférence pour regarder les choses comme des barres empilées à 100% (quand elles totalisent à 100%).
test <- data.frame(sample(letters[1:2], 100, replace=T), sample(letters[3:8], 100, replace=T))
colnames(test) <- c("variable","value")
test <- cast(test, variable + value ~ .)
colnames(test)[3] <- "frequ"
test <- ddply(test,"variable", function(x) {
x <- x[order(x$value),]
x$cfreq <- cumsum(x$frequ)/sum(x$frequ)
x$pos <- (c(0,x$cfreq[-nrow(x)])+x$cfreq)/2
x$freq <- (x$frequ)/sum(x$frequ)
x
})
plot.tmp <- ggplot(test, aes(variable,frequ, fill=value)) + geom_bar(stat="identity", position="fill") + coord_flip() + scale_y_continuous("", formatter="percent")
Merci de partager le "conseil" PANEL sur la méthode ggplot
.
Pour information: vous pouvez générer des pourcentages dans y lab
, sur le même histogramme, en utilisant count
et group
dans la méthode ggplot
:
ggplot(test, aes(test2,fill=test1))
+ geom_bar(aes(y = (..count..)/tapply(..count..,..group..,sum)[..group..]), position="dodge")
+ scale_y_continuous(labels = percent)