막대 순서 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)
일반적으로 요인 수준을 원하는 순서로 설정하면 됩니다.지정하지 않은 상태로 두면 요인 수준이 알파벳 순으로 정렬됩니다.또한 위와 같이 호출 내에서 수준 순서를 지정하여 요인을 지정할 수 있으며, 다른 방법도 가능합니다.
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')
간단한 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_reorder
forcats
패키지:
내림차순
df %>%
count(Position) %>%
ggplot(aes(x = reorder(Position, -n), y = n)) +
geom_bar(stat = 'identity') +
xlab("Position")
오름차순
df %>%
count(Position) %>%
ggplot(aes(x = reorder(Position, n), y = n)) +
geom_bar(stat = 'identity') +
xlab("Position")
데이터 프레임:
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)
는 의주 카성생합다의 합니다.Position
column에 표시됩니다.)
당신의 그럼당신의.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)
차트 열이 아래 데이터 프레임에서와 같이 숫자 변수에서 가져온 경우 더 간단한 솔루션을 사용할 수 있습니다.
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)
으로 기적으로bar_chart()
막대를 정렬하고 수평 그림을 표시합니다.하려면 당해집변려면하경을합horizontal = FALSE
.다가.bar_chart()
막대와 축 사이의 보기 흉한 '갭'을 제거합니다.
두 변수 사이의 관계를 보는 것이 아니라 단일 변수("위치")의 분포만 살펴보기 때문에 히스토그램이 더 적합한 그래프일 수 있습니다. ggplot에는 gem_histogram()이 있으므로 다음을 쉽게 수행할 수 있습니다.
ggplot(theTable, aes(x = Position)) + geom_histogram(stat="count")
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()
"위치"와 같은 이산 데이터의 경우, 우리는 다음을 사용하여 막대의 높이에 대한 값을 제공하기 위해 미적으로 계산된 통계를 지정해야 합니다.stat = "count"
:
ggplot(theTable, aes(x = Position)) + geom_histogram(stat = "count")
참고: 궁금하고 혼란스럽게도 사용할 수 있습니다.stat = "count"
연속적인 데이터에 대해서도 마찬가지입니다. 그리고 저는 그것이 미적으로 더 만족스러운 그래프를 제공한다고 생각합니다.
ggplot(theTable, aes(x = Score)) + geom_histogram(stat = "count")
편집 : 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)
언급URL : https://stackoverflow.com/questions/5208679/order-bars-in-ggplot2-bar-graph
'source' 카테고리의 다른 글
MongoEngine을 사용하여 정렬하시겠습니까? (0) | 2023.06.28 |
---|---|
Dapper를 사용하여 한 번의 왕복에 여러 개의 SQL 문이 있습니다.그물 (0) | 2023.06.28 |
변환 상태가 업데이트되지 않음 (0) | 2023.06.28 |
미래 수익률 값을 변수처럼 사용하는 방법 플롯 (0) | 2023.06.23 |
로드 밸런서를 생성하지 못했습니다. 이유:기본 VPC를 찾을 수 없음 (0) | 2023.06.23 |