Estou tentando criar um gráfico de barras em que a barra maior esteja mais próxima do eixo y e a barra mais curta esteja mais distante. Então isso é como a tabela que eu tenho
Name Position
1 James Goalkeeper
2 Frank Goalkeeper
3 Jean Defense
4 Steve Defense
5 John Defense
6 Tim Striker
Estou tentando criar um gráfico de barras que mostre o número de jogadores de acordo com a posição
p <- ggplot(theTable, aes(x = Position)) + geom_bar(binwidth = 1)
mas o gráfico mostra a barra do goleiro primeiro, depois a defesa e, finalmente, a atacante. Eu gostaria que o gráfico fosse ordenado para que a barra de defesa fique mais próxima do eixo y, do goleiro e, finalmente, do atacante. obrigado
ggplot2
, e não ao OPRespostas:
A chave da encomenda é definir os níveis do fator na ordem desejada. Um fator ordenado não é necessário; as informações extras em um fator ordenado não são necessárias e, se esses dados estiverem sendo usados em qualquer modelo estatístico, pode resultar em uma parametrização errada - contrastes polinomiais não são adequados para dados nominais como esse.
No sentido mais geral, simplesmente precisamos definir os níveis dos fatores para que estejam na ordem desejada. Se não especificado, os níveis de um fator serão classificados em ordem alfabética. Você também pode especificar a ordem do nível na chamada para fatorar, como acima, e outras maneiras também são possíveis.
fonte
within
, não há necessidade de usartheTable$Position
, e você pode fazer isso apenassort(-table(...))
por ordem decrescente.-
você usa, pois é muito mais fácil obter a intenção dodecreasing = TRUE
que perceber-
o restante do código.levels(theTable$Position) <- c(...)
leva a um comportamento indesejado, onde as entradas reais do quadro de dados são reordenadas, e não apenas os níveis do fator. Veja esta pergunta . Talvez você deva modificar ou remover essas linhas?levels<-
. Vou editar essa parte, pelo menos provisoriamente.levels<-()
hoje. Isso é algo de 8 anos atrás e não me lembro se as coisas eram diferentes na época ou se eu estava completamente errado, mas, independentemente disso, está errado e deve ser apagado! Obrigado!@GavinSimpson:
reorder
é uma solução poderosa e eficaz para isso:fonte
ggplot(theTable,aes(x=reorder(Position,Position,length))+geom_bar()
Usando
scale_x_discrete (limits = ...)
para especificar a ordem das barras.fonte
Eu acho que as soluções já fornecidas são excessivamente detalhadas. Uma maneira mais concisa de fazer um gráfico de barras classificado por frequência com o ggplot é
É semelhante ao sugerido por Alex Brown, mas um pouco mais curto e funciona sem uma definição de função anônima.
Atualizar
Acho que minha solução antiga era boa na época, mas hoje em dia prefiro usar os
forcats::fct_infreq
níveis de fator de classificação por frequência:fonte
Como
reorder()
na resposta de Alex Brown, também poderíamos usarforcats::fct_reorder()
. Basicamente, classificará os fatores especificados no 1º arg, de acordo com os valores do 2º arg após a aplicação de uma função especificada (padrão = mediana, que é o que usamos aqui como apenas um valor por nível de fator).É uma pena que, na pergunta do OP, a ordem necessária também seja alfabética, pois é a ordem de classificação padrão quando você cria fatores, para ocultar o que essa função está realmente fazendo. Para deixar mais claro, substituirei "Goleiro" por "Zoalkeeper".
fonte
Uma simples reordenação de fatores baseada em dplyr pode resolver esse problema:
fonte
Você só precisa especificar a
Position
coluna como um fator ordenado em que os níveis são ordenados por suas contagens:(Observe que
table(Position)
produz uma contagem de frequência daPosition
coluna.)Então sua
ggplot
função mostrará as barras em ordem decrescente de contagem. Não sei se há uma opçãogeom_bar
para fazer isso sem ter que criar explicitamente um fator ordenado.fonte
reorder()
de que a biblioteca de estatísticas realiza a mesma tarefa.reorder()
neste caso? O fator que requer reordenação precisa ser reordenado por alguma função em si e estou lutando para encontrar uma boa maneira de fazer isso.with(theTable, reorder(Position, as.character(Position), function(x) sum(duplicated(x))))
é uma maneira, e outrowith(theTable, reorder(Position, as.character(Position), function(x) as.numeric(table(x))))
, mas estes são tão complicado ...sort
em vez deorder
reorder
é hábil em fazer. Concordo com esta questão de que é necessário algo mais envolvido. Desculpe pela confusão.Além de forcats :: fct_infreq, mencionado por @HolgerBrandl, há forcats :: fct_rev, que reverte a ordem dos fatores.
fonte
Concordo com o zach que contar no dplyr é a melhor solução. Eu descobri que esta é a versão mais curta:
Isso também será significativamente mais rápido do que reordenar os níveis dos fatores previamente, pois a contagem é feita no dplyr, não no ggplot ou no uso
table
.fonte
Se as colunas do gráfico vierem de uma variável numérica como no quadro de dados abaixo, você poderá usar uma solução mais simples:
O sinal de menos antes da variável de classificação (-Qty) controla a direção da classificação (ascendente / descendente)
Aqui estão alguns dados para teste:
Quando encontrei este tópico, essa era a resposta que estava procurando. Espero que seja útil para os outros.
fonte
Outra alternativa usando o reordenamento para ordenar os níveis de um fator. Em ordem crescente (n) ou decrescente (-n) com base na contagem. Muito parecido com o usado
fct_reorder
noforcats
pacote:Ordem decrescente
Ordem ascendente
Quadro de dados:
fonte
Como estamos apenas olhando para a distribuição de uma única variável ("Posição") em vez de olhar para o relacionamento entre duas variáveis , talvez um histograma seja o gráfico mais apropriado. O ggplot possui geom_histogram () que facilita:
Usando geom_histogram ():
Eu acho que geom_histogram ( ) é um pouco peculiar, pois trata dados contínuos e discretos de maneira diferente.
Para dados contínuos , você pode apenas usar geom_histogram () sem parâmetros. Por exemplo, se adicionarmos um vetor numérico "Pontuação" ...
e use geom_histogram () na variável "Score" ...
Para dados discretos como "Position", precisamos especificar uma estatística calculada calculada pela estética para fornecer o valor y da altura das barras usando
stat = "count"
:Nota: Curiosa e confusa, você também pode usar
stat = "count"
para dados contínuos e acho que ele fornece um gráfico mais esteticamente agradável.Edições : resposta estendida em resposta às sugestões úteis de DebanjanB .
fonte
Achei muito irritante que
ggplot2
não ofereça uma solução 'automática' para isso. Por isso criei abar_chart()
funçãoggcharts
.Por padrão,
bar_chart()
classifica as barras e exibe uma plotagem horizontal. Para mudar esse conjuntohorizontal = FALSE
. Além disso,bar_chart()
remove a 'lacuna' feia entre as barras e o eixo.fonte