빈도 / 값으로 이산 x 스케일을 주문


137

불연속 x 스케일이있는 ggplot을 사용하여 회피 된 막대 차트를 만들고 있는데 x 축이 알파벳 순서로 정렬되어 있지만 y 축 값으로 정렬되도록 다시 정렬해야합니다 (즉 가장 높은 막대는 왼쪽에 위치).

순서 또는 정렬을 시도했지만 x 축을 정렬하지만 막대는 각각 정렬하지 않았습니다.

내가 뭘 잘못 했니?

답변:


105

x 축에서 요인 수준을 수동으로 설정하십시오. 예를 들면 다음과 같습니다.

library(ggplot2)
# Automatic levels
ggplot(mtcars, aes(factor(cyl))) + geom_bar()    

계수 수준이 자동으로 결정된 자동차 데이터 집합의 ggplot

# Manual levels
cyl_table <- table(mtcars$cyl)
cyl_levels <- names(cyl_table)[order(cyl_table)]
mtcars$cyl2 <- factor(mtcars$cyl, levels = cyl_levels)
# Just to be clear, the above line is no different than:
# mtcars$cyl2 <- factor(mtcars$cyl, levels = c("6","4","8"))
# You can manually set the levels in whatever order you please. 
ggplot(mtcars, aes(cyl2)) + geom_bar()

계수 수준이 수동으로 재정렬 된 자동차 데이터 집합의 ggplot

제임스가 그의 대답에서 지적했듯이, reorder요인 수준을 재정렬하는 관용적 방법입니다.

mtcars$cyl3 <- with(mtcars, reorder(cyl, cyl, function(x) -length(x)))
ggplot(mtcars, aes(cyl3)) + geom_bar()

재정렬 기능을 사용하여 계수 수준이 재정렬 된 자동차 데이터 세트의 ggplot


197

나를위한 가장 좋은 방법은 limits매개 변수로 필요한 순서대로 범주가있는 벡터를 사용하는 것이 었 습니다 scale_x_discrete. 나는 그것이 매우 간단하고 간단한 해결책이라고 생각합니다.

ggplot(mtcars, aes(factor(cyl))) + 
  geom_bar() + 
  scale_x_discrete(limits=c(8,4,6))

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


1
@HendyIrawan 다른 치수 (색상, 채우기)가 동일한 변수에 매핑되어 있지 않으면 범례가 없습니다.
Gregor Thomas

5
이것이 가장 좋은 대답이라고 생각합니다. x 축 값의 순서를 제어하며 데이터 프레임을 변환하거나 영향을 미치지 않습니다. 통화 내에서도 데이터 의 사용 factorreorder특성이 변경 ggplot()되므로 당면한 문제에 필요한 것 이상을 수행합니다.
mjandrews

2
이것은 받아 들여야 할 답변입니다! 하나의 우아한 (사전 정의 된) 코드 행에서 수행 할 수있는 작업에 2 ~ 3 줄의 코드를 작성하여 문제를 해결하는 이유는 무엇입니까?
SilSur

1
이것은 또한 y 값으로 x를 주문하는 데 도움이되었습니다. scale_x_discrete(limits = DT$x[order(-DT$y)])+
armipunk

38

당신은 사용할 수 있습니다 reorder:

qplot(reorder(factor(cyl),factor(cyl),length),data=mtcars,geom="bar")

편집하다:

왼쪽에 가장 높은 막대를 갖기 위해서는 약간의 kludge를 사용해야합니다.

qplot(reorder(factor(cyl),factor(cyl),function(x) length(x)*-1),
   data=mtcars,geom="bar")

나는 이것이 또한 음의 높이를 가질 것으로 기대하지만 그렇지 않습니다.


5
나는이 답변에 더 많은 공의가 없다고 충격을 받았다.이 시간의 90 %가 적절한 방법입니다.
Gregor Thomas

1
나는 두 가지 요소 호출이 불필요한 것이라고 생각합니다. 첫 번째 인수에 대한 암시 적 호출이 있으며 두 번째 인수는 숫자로 가정합니다.
IRTFM

이러한 솔루션이 어떤 작업을 수행하는지 파악하는 데 도움이되는 설명 : rstudio-pubs-static.s3.amazonaws.com/…
keithpjolley

30

Hadley는라는 패키지를 개발하고 forcats있습니다. 이 패키지는 작업을 훨씬 쉽게 해줍니다. fct_infreq()요인의 빈도에 따라 x 축의 순서를 변경하려는 경우 활용할 수 있습니다 . mtcars이 게시물 의 예에서는 cyl각 레벨의 빈도별로 레벨 을 재정렬하려고 합니다. 가장 자주 나타나는 레벨은 왼쪽에 유지됩니다. 당신이 필요한 전부 fct_infreq()입니다.

library(ggplot2)
library(forcats)

ggplot(mtcars, aes(fct_infreq(factor(cyl)))) +
geom_bar() +
labs(x = "cyl")

반대로 돌아가고 싶다면와 fct_rev()함께 사용할 수 있습니다 fct_infreq().

ggplot(mtcars, aes(fct_rev(fct_infreq(factor(cyl))))) +
geom_bar() +
labs(x = "cyl") 

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


2

나는 이것이 오래되었다는 것을 알고 있지만, 내가 만든이 기능은 누군가에게 유용 할 수 있습니다.

order_axis<-function(data, axis, column)
{
  # for interactivity with ggplot2
  arguments <- as.list(match.call())
  col <- eval(arguments$column, data)
  ax <- eval(arguments$axis, data)

  # evaluated factors
  a<-reorder(with(data, ax), 
             with(data, col))

  #new_data
  df<-cbind.data.frame(data)
  # define new var
  within(df, 
         do.call("<-",list(paste0(as.character(arguments$axis),"_o"), a)))
}

이제이 함수를 사용하여 다음과 같이 ggplot2로 대화식으로 플롯 할 수 있습니다.

ggplot(order_axis(df, AXIS_X, COLUMN_Y), 
       aes(x = AXIS_X_o, y = COLUMN_Y)) +
        geom_bar(stat = "identity")

알 수 order_axis있듯이이 함수는 이름이 같지만 _o끝에는 새 열이있는 다른 데이터 프레임을 만듭니다 . 이 새로운 열은 오름차순으로 레벨을 가지므로 ggplot2는 자동으로 그 순서로 플로팅됩니다.

이것은 다소 제한적이지만 (문자 또는 요인 및 열의 숫자 조합 및 오름차순으로 만 작동) 여전히 이동 중에 플롯하는 데 매우 유용합니다.


나는 단지 reorder직접 사용하는 것과 비교할 때 이것의 이점을 보지 못한다고 생각 합니다. 하지 않습니다 ggplot(df, aes(x = reorder(AXIS_X, COLUMN_Y), y = COLUMN_Y)) + ...에 대한 간결, 같은 일을하고, 도우미 기능이없는?
Gregor Thomas
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.