web-dev-qa-db-fra.com

pourcentage sur y labo dans un graphique à barres ggplot à facettes?

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.

32
Andreas

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)

alt text

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.

21
daroczig

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é.

45
James

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()). alt text

7
daroczig

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)
)
1
Chase

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")
0
Brandon Bertelsen

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)
0
Lilly