[r] ggplot2 막대 그래프의 주문 막대

가장 큰 막대가 y 축에 가장 가깝고 가장 짧은 막대가 가장 먼 막대 그래프를 만들려고합니다. 그래서 이것은 제가 가지고있는 테이블과 같습니다.

    Name   Position
1   James  Goalkeeper
2   Frank  Goalkeeper
3   Jean   Defense
4   Steve  Defense
5   John   Defense
6   Tim    Striker

위치에 따라 플레이어 수를 나타내는 막대 그래프를 만들려고합니다.

p <- ggplot(theTable, aes(x = Position)) + geom_bar(binwidth = 1)

그러나 그래프는 먼저 골키퍼 막대를 보여주고 방어와 마지막으로 스트라이커를 보여줍니다. 방어 막대가 y 축, 골키퍼, 마지막으로 스트라이커에 가장 가깝도록 그래프를 정렬하고 싶습니다. 감사



답변

순서의 핵심은 요인의 수준을 원하는 순서로 설정하는 것입니다. 주문 된 요소는 필요하지 않습니다. 정렬 된 요소의 추가 정보는 필요하지 않으며 이러한 데이터가 통계 모델에 사용되는 경우 잘못된 매개 변수가 발생할 수 있습니다. 다항식 대비는 이와 같은 명목 데이터에는 적합하지 않습니다.

## set the levels in order we want
theTable <- within(theTable,
                   Position <- factor(Position,
                                      levels=names(sort(table(Position),
                                                        decreasing=TRUE))))
## plot
ggplot(theTable,aes(x=Position))+geom_bar(binwidth=1)

막대 그래프 그림

가장 일반적인 의미에서 요인 수준을 원하는 순서로 설정하면됩니다. 지정하지 않으면 요인의 수준이 알파벳순으로 정렬됩니다. 위와 같이 요소를 호출하여 수준 순서를 지정할 수도 있으며 다른 방법도 가능합니다.

theTable$Position <- factor(theTable$Position, levels = c(...))


답변

@GavinSimpson :이를 reorder위한 강력하고 효과적인 솔루션입니다 :

ggplot(theTable,
       aes(x=reorder(Position,Position,
                     function(x)-length(x)))) +
       geom_bar()


답변

사용 scale_x_discrete (limits = ...)바의 순서를 지정할 수 있습니다.

positions <- c("Goalkeeper", "Defense", "Striker")
p <- ggplot(theTable, aes(x = Position)) + scale_x_discrete(limits = positions)


답변

이미 제공된 솔루션이 지나치게 장황하다고 생각합니다. ggplot으로 주파수 정렬 막대 그래프를 수행하는 더 간결한 방법은

ggplot(theTable, aes(x=reorder(Position, -table(Position)[Position]))) + geom_bar()

Alex Brown이 제안한 것과 비슷하지만 조금 더 짧으며 임의의 함수 정의없이 작동합니다.

최신 정보

나는 이전의 해결책이 당시에는 좋았지 만 요즘에는 forcats::fct_infreq빈도별로 요인 수준을 정렬하는 것이 좋습니다 .

require(forcats)

ggplot(theTable, aes(fct_infreq(Position))) + geom_bar()


답변

마찬가지로 reorder()알렉스 브라운의 대답에, 우리는 또한 사용할 수 있습니다 forcats::fct_reorder(). 지정된 함수를 적용한 후 두 번째 인수의 값에 따라 기본적으로 첫 번째 인수에 지정된 요인을 정렬합니다 (기본값 = 중간 값, 여기서는 요인 수준 당 하나의 값을 갖는 것).

OP의 질문에서 필요한 순서도 요인을 만들 때 기본 정렬 순서이므로 알파벳순이므로이 함수가 실제로 수행하는 작업을 숨길 수 있습니다. 더 명확하게하기 위해 “Goalkeeper”를 “Zoalkeeper”로 바꾸겠습니다.

library(tidyverse)
library(forcats)

theTable <- data.frame(
                Name = c('James', 'Frank', 'Jean', 'Steve', 'John', 'Tim'),
                Position = c('Zoalkeeper', 'Zoalkeeper', 'Defense',
                             'Defense', 'Defense', 'Striker'))

theTable %>%
    count(Position) %>%
    mutate(Position = fct_reorder(Position, n, .desc = TRUE)) %>%
    ggplot(aes(x = Position, y = n)) + geom_bar(stat = 'identity')

여기에 이미지 설명을 입력하십시오


답변

간단한 dplyr 기반 요인의 재정렬로이 문제를 해결할 수 있습니다.

library(dplyr)

#reorder the table and reset the factor to that ordering
theTable %>%
  group_by(Position) %>%                              # calculate the counts
  summarize(counts = n()) %>%
  arrange(-counts) %>%                                # sort by counts
  mutate(Position = factor(Position, Position)) %>%   # reset factor
  ggplot(aes(x=Position, y=counts)) +                 # plot 
    geom_bar(stat="identity")                         # plot histogram


답변

레벨을 계수정렬Position순서화 된 요소 가되도록 열 을 지정하면 됩니다 .

theTable <- transform( theTable,
       Position = ordered(Position, levels = names( sort(-table(Position)))))

( table(Position)이는 Position열의 빈도 수를 생성합니다 .)

그런 다음 ggplot함수는 막대를 카운트 순서대로 표시합니다. geom_bar순서 인수를 명시 적으로 만들지 않고이 작업을 수행 할 수 있는 옵션이 있는지 모르겠습니다 .