불연속 x 스케일이있는 ggplot을 사용하여 회피 된 막대 차트를 만들고 있는데 x 축이 알파벳 순서로 정렬되어 있지만 y 축 값으로 정렬되도록 다시 정렬해야합니다 (즉 가장 높은 막대는 왼쪽에 위치).
순서 또는 정렬을 시도했지만 x 축을 정렬하지만 막대는 각각 정렬하지 않았습니다.
내가 뭘 잘못 했니?
답변
x 축에서 요인 수준을 수동으로 설정하십시오. 예를 들면 다음과 같습니다.
library(ggplot2)
# Automatic levels
ggplot(mtcars, aes(factor(cyl))) + geom_bar()
# 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()
제임스가 그의 대답에서 지적했듯이, reorder
요인 수준을 재정렬하는 관용적 방법입니다.
mtcars$cyl3 <- with(mtcars, reorder(cyl, cyl, function(x) -length(x)))
ggplot(mtcars, aes(cyl3)) + geom_bar()
답변
나를위한 가장 좋은 방법은 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는 자동으로 그 순서로 플로팅됩니다.
이것은 다소 제한적이지만 (문자 또는 요인 및 열의 숫자 조합 및 오름차순으로 만 작동) 여전히 이동 중에 플롯하는 데 매우 유용합니다.