source

막대 순서 ggplot2 막대 그래프

factcode 2023. 6. 28. 22:00
반응형

막대 순서 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축에 가장 가깝고 골키퍼가 1개, 마지막으로 공격수가 1개가 되도록 그래프를 정렬했으면 합니다.감사해요.

Simpson: @gavin 가빈슨심:reorder이를 위한 강력하고 효과적인 솔루션입니다.

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

순서를 지정할 때 중요한 것은 원하는 순서로 요인의 수준을 설정하는 것입니다.순서 요인이 필요하지 않습니다. 순서 요인에 추가 정보가 필요하지 않으며 이러한 데이터가 통계 모형에 사용되는 경우 잘못된 모수가 나타날 수 있습니다. 다항식 대비는 이와 같은 명목 데이터에 적합하지 않습니다.

## 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)

barplot figure

일반적으로 요인 수준을 원하는 순서로 설정하면 됩니다.지정하지 않은 상태로 두면 요인 수준이 알파벳 순으로 정렬됩니다.또한 위와 같이 호출 내에서 수준 순서를 지정하여 요인을 지정할 수 있으며, 다른 방법도 가능합니다.

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

용사를 합니다.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')

enter image description here

간단한 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

순서를 다시 지정하여 요인 수준을 정렬하는 또 다른 방법입니다.카운트를 기준으로 오름차순(n) 또는 내림차순(-n)입니다.사용하는 것과 매우 유사합니다.fct_reorderforcats패키지:

내림차순

df %>%
  count(Position) %>%
  ggplot(aes(x = reorder(Position, -n), y = n)) +
  geom_bar(stat = 'identity') +
  xlab("Position")

enter image description here

오름차순

df %>%
  count(Position) %>%
  ggplot(aes(x = reorder(Position, n), y = n)) +
  geom_bar(stat = 'identity') +
  xlab("Position")

enter image description here

데이터 프레임:

df <- structure(list(Position = structure(c(3L, 3L, 1L, 1L, 1L, 2L), .Label = c("Defense", 
"Striker", "Zoalkeeper"), class = "factor"), Name = structure(c(2L, 
1L, 3L, 5L, 4L, 6L), .Label = c("Frank", "James", "Jean", "John", 
"Steve", "Tim"), class = "factor")), class = "data.frame", row.names = c(NA, 
-6L))

하면 됩니다.Position수준이 카운트별로 정렬된 순서 요인이 되는 열:

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

:table(Position)는 의주 카성생합다의 합니다.Positioncolumn에 표시됩니다.)

당신의 그럼당신의.ggplot함수는 카운트가 감소하는 순서로 막대를 표시합니다.에 옵션이 있는지 geom_bar순서화된 요인을 명시적으로 생성할 필요 없이 이 작업을 수행할 수 있습니다.

▁▁additionforcats::fct_infreq@HolgerBrandl에 의해 언급된, 거기에 있습니다.forcats::fct_rev인자 순서가 반대로 됩니다.

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

p1 <- ggplot(theTable, aes(x = Position)) + geom_bar()
p2 <- ggplot(theTable, aes(x = fct_infreq(Position))) + geom_bar()
p3 <- ggplot(theTable, aes(x = fct_rev(fct_infreq(Position)))) + geom_bar()

gridExtra::grid.arrange(p1, p2, p3, nrow=3)             

enter image description here

차트 열이 아래 데이터 프레임에서와 같이 숫자 변수에서 가져온 경우 더 간단한 솔루션을 사용할 수 있습니다.

ggplot(df, aes(x = reorder(Colors, -Qty, sum), y = Qty)) 
+ geom_bar(stat = "identity")  

정렬 변수(-Qty) 앞의 빼기 기호는 정렬 방향(상승/하강)을 제어합니다.

다음은 테스트를 위한 몇 가지 데이터입니다.

df <- data.frame(Colors = c("Green","Yellow","Blue","Red","Yellow","Blue"),  
                 Qty = c(7,4,5,1,3,6)
                )

**Sample data:**
  Colors Qty
1  Green   7
2 Yellow   4
3   Blue   5
4    Red   1
5 Yellow   3
6   Blue   6

제가 이 실을 찾았을 때, 그것이 제가 찾던 답이었습니다.다른 사람들에게 유용하기를 바랍니다.

저는 dplyr 내에서 계산하는 것이 최선의 해결책이라는 Zach의 의견에 동의합니다.저는 이것이 가장 짧은 버전이라는 것을 알았습니다.

dplyr::count(theTable, Position) %>%
          arrange(-n) %>%
          mutate(Position = factor(Position, Position)) %>%
          ggplot(aes(x=Position, y=n)) + geom_bar(stat="identity")

되거나 dplyr gplot을 사용하여 수행되므로 하는 것보다 .table.

나는 그것이 매우 짜증나는 일이라고 생각했습니다.ggplot2이에 대한 '자동' 솔루션을 제공하지 않습니다.그래서 제가 만든 것입니다.bar_chart()…에 종사하는

ggcharts::bar_chart(theTable, Position)

enter image description here

으로 기적으로bar_chart()막대를 정렬하고 수평 그림을 표시합니다.하려면 당해집변려면하경을합horizontal = FALSE.다가.bar_chart()막대와 축 사이의 보기 흉한 '갭'을 제거합니다.

변수 사이의 관계를 보는 것이 아니라 단일 변수("위치")의 분포만 살펴보기 때문에 히스토그램이 더 적합한 그래프일 수 있습니다. ggplot에는 gem_histogram()이 있으므로 다음을 쉽게 수행할 수 있습니다.

ggplot(theTable, aes(x = Position)) + geom_histogram(stat="count")

enter image description here

gem_histogram() 사용:

연속 데이터와 이산 데이터를 다르게 취급하기 때문에 gem_histogram()은 좀 특이하다고 생각합니다.

연속형 데이터의 경우 모수 없이 gem_histogram()만 사용할 수 있습니다.예를 들어, 숫자 벡터 "점수"를 추가하면...

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

그리고 "점수" 변수에 gem_histogram()을 사용합니다...

ggplot(theTable, aes(x = Score)) + geom_histogram()

enter image description here

"위치"와 같은 이산 데이터의 경우, 우리는 다음을 사용하여 막대의 높이에 대한 값을 제공하기 위해 미적으로 계산된 통계를 지정해야 합니다.stat = "count":

 ggplot(theTable, aes(x = Position)) + geom_histogram(stat = "count")

참고: 궁금하고 혼란스럽게도 사용할 수 있습니다.stat = "count"연속적인 데이터에 대해서도 마찬가지입니다. 그리고 저는 그것이 미적으로 더 만족스러운 그래프를 제공한다고 생각합니다.

ggplot(theTable, aes(x = Score)) + geom_histogram(stat = "count")

enter image description here

편집 : DebanjanB의 도움이 되는 제안에 대한 답변을 연장

library(ggplot2)
library(magrittr)

dd <- tibble::tribble(
    ~Name,    ~Position,
  "James", "Goalkeeper",
  "Frank", "Goalkeeper",
   "Jean",    "Defense",
   "John",    "Defense",
  "Steve",    "Defense",
    "Tim",    "Striker"
  )


dd %>% ggplot(aes(x = forcats::fct_infreq(Position))) + geom_bar()

repref v2.0.2를 사용하여 2022-08-30에 생성됨

사용하지 않으려는 경우ggplot2또한 ggpubr은 정말로 도움이 되는 주장을 가지고 있습니다.ggbarplot기능.다음을 기준으로 막대를 정렬할 수 있습니다.sort.val다음과 같은 "message"와 "message"로 표현합니다.

library(dplyr)
library(ggpubr)
# desc
df %>%
  count(Position) %>%
  ggbarplot(x = "Position", 
            y = "n",
            sort.val = "desc")

# asc
df %>%
  count(Position) %>%
  ggbarplot(x = "Position", 
            y = "n",
            sort.val = "asc")

reprex 패키지(v2.0.1)에 의해 2022-08-14에 생성되었습니다.

보시다시피, 막대를 정렬하는 것은 정말 간단합니다.막대가 그룹화된 경우에도 이 작업을 수행할 수 있습니다.몇 가지 유용한 예를 보려면 위 링크를 확인하십시오.

이 코드를 간단히 사용할 수 있습니다.

ggplot(yourdatasetname, aes(Position, fill = Name)) + 
     geom_bar(col = "black", size = 2)

enter image description here

언급URL : https://stackoverflow.com/questions/5208679/order-bars-in-ggplot2-bar-graph

반응형