가장 큰 막대가 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
순서 인수를 명시 적으로 만들지 않고이 작업을 수행 할 수 있는 옵션이 있는지 모르겠습니다 .