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

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

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

내가 뭘 잘못 했니?



답변

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


답변

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

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

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


답변

당신은 사용할 수 있습니다 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")

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


답변

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

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


답변

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

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는 자동으로 그 순서로 플로팅됩니다.

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


답변