Mostrar% em vez de contagens em charts de variables ​​categóricas

Eu estou traçando uma variável categórica e em vez de mostrar as contagens para cada valor de categoria.

Eu estou procurando uma maneira de obter ggplot para exibir a porcentagem de valores nessa categoria. Claro, é possível criar outra variável com a porcentagem calculada e traçar aquela, mas tenho que fazer várias dezenas de vezes e espero conseguir isso em um comando.

Eu estava experimentando com algo parecido

 qplot(mydataf) + stat_bin(aes(n = nrow(mydataf), y = ..count../n)) + scale_y_continuous(formatter = "percent") 

mas devo usá-lo incorretamente, pois tenho erros.

Para reproduzir facilmente a configuração, aqui está um exemplo simplificado:

 mydata <- c ("aa", "bb", NULL, "bb", "cc", "aa", "aa", "aa", "ee", NULL, "cc"); mydataf <- factor(mydata); qplot (mydataf); #this shows the count, I'm looking to see % displayed. 

No caso real, provavelmente usarei ggplot vez de qplot , mas o jeito certo de usar stat_bin ainda me escapa.

Eu também tentei estas quatro abordagens:

 ggplot(mydataf, aes(y = (..count..)/sum(..count..))) + scale_y_continuous(formatter = 'percent'); ggplot(mydataf, aes(y = (..count..)/sum(..count..))) + scale_y_continuous(formatter = 'percent') + geom_bar(); ggplot(mydataf, aes(x = levels(mydataf), y = (..count..)/sum(..count..))) + scale_y_continuous(formatter = 'percent'); ggplot(mydataf, aes(x = levels(mydataf), y = (..count..)/sum(..count..))) + scale_y_continuous(formatter = 'percent') + geom_bar(); 

mas todos os 4 dão:

 Error: ggplot2 doesn't know how to deal with data of class factor 

O mesmo erro aparece para o caso simples de

 ggplot (data=mydataf, aes(levels(mydataf))) + geom_bar() 

então é claramente algo sobre como o ggplot interage com um único vetor. Eu estou coçando a cabeça, googling para esse erro dá um único resultado .

Desde que isso foi respondido, houve algumas mudanças significativas na syntax do ggplot . Resumindo a discussão nos comentários acima:

  require(ggplot2) require(scales) p < - ggplot(mydataf, aes(x = foo)) + geom_bar(aes(y = (..count..)/sum(..count..))) + ## version 3.0.0 scale_y_continuous(labels=percent) 

Aqui está um exemplo reproduzível usando mtcars :

  ggplot(mtcars, aes(x = factor(hp))) + geom_bar(aes(y = (..count..)/sum(..count..))) + scale_y_continuous(labels = percent) ## version 3.0.0 

insira a descrição da imagem aqui

Esta questão é atualmente o hit # 1 no google para 'ggplot contagem vs percentual histograma' por isso espero que isso ajude a destilar todas as informações atualmente alojadas em comentários sobre a resposta aceita.

Observação: Se hp não estiver definido como um fator, ggplot retornará:

insira a descrição da imagem aqui

este código modificado deve funcionar

 p = ggplot(mydataf, aes(x = foo)) + geom_bar(aes(y = (..count..)/sum(..count..))) + scale_y_continuous(formatter = 'percent') 

se seus dados tiverem NAs e você não quiser que eles sejam incluídos no gráfico, passe na.omit (mydataf) como argumento para ggplot.

espero que isto ajude.

Com ggplot2 versão 2.1.0 é

 + scale_y_continuous(labels = scales::percent) 

Em março de 2017, com ggplot2 2.2.1 eu acho que a melhor solução é explicada em R de Hadley Wickham para o livro de ciência de dados:

 ggplot(mydataf) + stat_count(mapping = aes(x=foo, y=..prop.., group=1)) 

stat_count calcula duas variables: count é usada por padrão, mas você pode optar por usar prop que mostre proporções.

Se você quiser porcentagens no eixo y e marcadas nas barras:

 library(ggplot2) library(scales) ggplot(mtcars, aes(x = as.factor(am))) + geom_bar(aes(y = (..count..)/sum(..count..))) + geom_text(aes(y = ((..count..)/sum(..count..)), label = scales::percent((..count..)/sum(..count..))), stat = "count", vjust = -0.25) + scale_y_continuous(labels = percent) + labs(title = "Manual vs. Automatic Frequency", y = "Percent", x = "Automatic Transmission") 

insira a descrição da imagem aqui

Ao adicionar os labels da barra, você pode querer omitir o eixo y para um gráfico mais limpo, adicionando ao final:

  theme( axis.text.y=element_blank(), axis.ticks=element_blank(), axis.title.y=element_blank() ) 

insira a descrição da imagem aqui

Se você quiser labels de porcentagem , mas Ns reais no eixo y, tente isto:

  library(scales) perbar=function(xx){ q=ggplot(data=data.frame(xx),aes(x=xx))+ geom_bar(aes(y = (..count..)),fill="orange") q=q+ geom_text(aes(y = (..count..),label = scales::percent((..count..)/sum(..count..))), stat="bin",colour="darkgreen") q } perbar(mtcars$disp) 

Aqui está uma solução alternativa para dados facetados. (A resposta aceita por @Andrew não funciona neste caso.) A idéia é calcular o valor percentual usando dplyr e, em seguida, usar geom_col para criar o gráfico.

 library(ggplot2) library(scales) library(magrittr) library(dplyr) binwidth < - 30 mtcars.stats <- mtcars %>% group_by(cyl) %>% mutate(bin = cut(hp, breaks=seq(0,400, binwidth), labels= seq(0+binwidth,400, binwidth)-(binwidth/2)), n = n()) %>% group_by(cyl, bin) %>% summarise(p = n()/n[1]) %>% ungroup() %>% mutate(bin = as.numeric(as.character(bin))) ggplot(mtcars.stats, aes(x = bin, y= p)) + geom_col() + scale_y_continuous(labels = percent) + facet_grid(cyl~.) 

Este é o enredo:

insira a descrição da imagem aqui

Para aqueles que chegam a isto depois de 2018, substitua “labels = percent_format ()” por “scales :: percent”