Estou plotando uma variável categórica e, em vez de mostrar as contagens para cada valor de categoria.
Estou procurando uma maneira ggplot
de exibir a porcentagem de valores nessa categoria. Obviamente, é possível criar outra variável com a porcentagem calculada e plotá-la, mas tenho que fazê-lo várias dezenas de vezes e espero conseguir isso em um único comando.
Eu estava experimentando algo como
qplot(mydataf) +
stat_bin(aes(n = nrow(mydataf), y = ..count../n)) +
scale_y_continuous(formatter = "percent")
mas devo usá-lo incorretamente, pois obtive erros.
Para reproduzir facilmente a configuração, veja 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 em ggplot
vez de qplot
, mas a maneira correta de usar stat_bin ainda me ilude.
Eu também tentei essas 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 no caso simples de
ggplot (data=mydataf, aes(levels(mydataf))) +
geom_bar()
então é claramente algo sobre como ggplot
interage com um único vetor. Estou coçando a cabeça, pesquisando no Google por esse erro, dá um único resultado .
Respostas:
Desde que isso foi respondido, houve algumas alterações significativas na
ggplot
sintaxe. Resumindo a discussão nos comentários acima:Aqui está um exemplo reproduzível usando
mtcars
:Atualmente, esta pergunta é o número 1 no google de 'contagem de ggplot versus histograma de porcentagem', portanto, espero que isso ajude a destilar todas as informações atualmente armazenadas em comentários sobre a resposta aceita.
Observação: Se
hp
não está definido como um fator, retornos ggplot:fonte
percent
o pacote do qual ele é feito para que o trabalho acima funcione (eu fiz).ggplot(mtcars, aes(x = factor(hp))) + geom_bar(aes(y = (..count..)/sum(..count..))) + scale_y_continuous(labels = scales::percent)
geom_bar(aes(y = (..count..)/tapply(..count..,..PANEL..,sum)[..PANEL..]))
. Cada faceta deve somar 100%.esse código modificado deve funcionar
se seus dados tiverem NAs e você não desejar que eles sejam incluídos no gráfico, passe na.omit (mydataf) como argumento para o ggplot.
espero que isto ajude.
fonte
formatter
argumento não funcionará mais. Em vez disso, você vai querer algo comolabels = percent_format())
.scales
biblioteca antes de usá-lapercent_format()
, caso contrário, não funcionará. 0.9.0 não carrega mais pacotes de suporte automaticamente.? stat_bin
. Mostra quais colunas adicionais são adicionadas ao quadro de dadosggplot2
. Todas as colunas extras são da forma..variable..
.aes(y = (..count..)/sum(..count..))
simplesmenteaes(y = ..density..)
? Visualmente dar imagem muito semelhante (mas ainda diferente)scales
biblioteca, em seguida, usarscale_y_continuous(labels=percent)
como mencionado nos docsCom o ggplot2 versão 2.1.0, é
fonte
Em março de 2017, com o
ggplot2
2.2.1, acho que a melhor solução é explicada no livro R de Hadley Wickham para ciência de dados:stat_count
calcula duas variáveis:count
é usada por padrão, mas você pode optar por usar asprop
que mostram proporções.fonte
fill
mapeamento (nenhum erro é gerado, mas nenhuma cor de preenchimento é adicionada).group = 1
para obter o mapeamento de preenchimento. talvez ele ajudagroup
parâmetro, no entanto, ele não mostra as porcentagens apropriadas, pois tudo pertence ao seu próprio grupo para cada valor x exclusivo.Se você deseja porcentagens no eixo y e rotuladas nas barras:
Ao adicionar os rótulos de barra, você pode omitir o eixo y para um gráfico mais limpo, adicionando ao final:
fonte
Se você quiser rótulos de porcentagem , mas Ns reais no eixo y, tente o seguinte:
fonte
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.
Este é o enredo:
fonte
Observe que se sua variável for contínua, você terá que usar geom_histogram (), pois a função agrupará a variável por "compartimentos".
fonte