범주형 변수의 차트에서 카운트 대신 백분율 표시
각 범주 값의 카운트를 표시하는 대신 범주형 변수를 표시합니다.
저는 그들을 보호할 방법을 찾고 있습니다.ggplot
해당 범주의 값 백분율을 표시합니다.물론 계산된 비율과 플롯으로 다른 변수를 만드는 것은 가능하지만, 몇십 번을 해야 하고 그것을 하나의 명령으로 달성하기를 바랍니다.
제가 지금 실험을 하고 있는 건
qplot(mydataf) +
stat_bin(aes(n = nrow(mydataf), y = ..count../n)) +
scale_y_continuous(formatter = "percent")
제가 잘못 사용했나 봅니다, 오류가 나서요.
설정을 쉽게 재생하기 위해 다음과 같은 간단한 예가 있습니다.
mydata <- c ("aa", "bb", NULL, "bb", "cc", "aa", "aa", "aa", "ee", NULL, "cc");
mydataf <- factor(mydata);
qplot (mydataf); #this shows the count, I'm looking to see % displayed.
진짜 경우에는 아마 제가.ggplot
대신에qplot
, 하지만 stat_bin을 사용하는 올바른 방법은 여전히 저를 피합니다.
저는 다음과 같은 네 가지 접근법도 시도해 보았습니다.
ggplot(mydataf, aes(y = (..count..)/sum(..count..))) +
scale_y_continuous(formatter = 'percent');
ggplot(mydataf, aes(y = (..count..)/sum(..count..))) +
scale_y_continuous(formatter = 'percent') + geom_bar();
ggplot(mydataf, aes(x = levels(mydataf), y = (..count..)/sum(..count..))) +
scale_y_continuous(formatter = 'percent');
ggplot(mydataf, aes(x = levels(mydataf), y = (..count..)/sum(..count..))) +
scale_y_continuous(formatter = 'percent') + geom_bar();
그러나 4개 모두 다음을 제공합니다.
Error: ggplot2 doesn't know how to deal with data of class factor
다음의 간단한 경우에도 동일한 오류가 나타납니다.
ggplot (data=mydataf, aes(levels(mydataf))) +
geom_bar()
그러니까 이건 분명히 어떻게 그가ggplot
단일 벡터와 상호작용합니다.저는 머리를 긁적이고 있습니다. 그 오류를 검색하면 단 하나의 결과가 나옵니다.
이것이 답변된 이후로 몇 가지 의미 있는 변화가 있었습니다.ggplot
통사론위의 의견에서 논의한 내용을 요약하면 다음과 같습니다.
require(ggplot2)
require(scales)
p <- ggplot(mydataf, aes(x = foo)) +
geom_bar(aes(y = (..count..)/sum(..count..))) +
## version 3.0.0
scale_y_continuous(labels=percent)
다음은 다음을 사용하여 재현할 수 있는 예입니다.mtcars
:
ggplot(mtcars, aes(x = factor(hp))) +
geom_bar(aes(y = (..count..)/sum(..count..))) +
scale_y_continuous(labels = percent) ## version 3.0.0
이 질문은 현재 구글에서 'ggplot count vs percentage histogram'의 1위를 차지하고 있기 때문에 이 질문이 수락된 답변에 대한 코멘트에 현재 저장되어 있는 모든 정보를 증류하는 데 도움이 되기를 바랍니다.
비고: 만약hp
인자로 설정되지 않음, ggplot 반환:
이 수정된 코드가 작동해야 합니다.
p = ggplot(mydataf, aes(x = foo)) +
geom_bar(aes(y = (..count..)/sum(..count..))) +
scale_y_continuous(formatter = 'percent')
데이터에 NA가 있고 해당 NA를 그림에 포함하지 않으려면 na.omit(mydataaf)를 ggplot의 인수로 전달합니다.
도움이 되기를 바랍니다.
ggplot2 버전 2.1.0의 경우
+ scale_y_continuous(labels = scales::percent)
2017년 3월 현재,ggplot2
2.2.1 최고의 해결책은 Hadley Wickham의 R for data science book에 설명되어 있다고 생각합니다.
ggplot(mydataf) + stat_count(mapping = aes(x=foo, y=..prop.., group=1))
stat_count
는 두 가지 변수를 계산합니다.count
는 기본적으로 사용되지만 사용을 선택할 수 있습니다.prop
비율을 보여주는 거지
y축에 백분율을 표시하고 막대에 레이블을 붙이려는 경우
library(ggplot2)
library(scales)
ggplot(mtcars, aes(x = as.factor(am))) +
geom_bar(aes(y = (..count..)/sum(..count..))) +
geom_text(aes(y = ((..count..)/sum(..count..)), label = scales::percent((..count..)/sum(..count..))), stat = "count", vjust = -0.25) +
scale_y_continuous(labels = percent) +
labs(title = "Manual vs. Automatic Frequency", y = "Percent", x = "Automatic Transmission")
막대 레이블을 추가할 때 끝에 다음을 추가하여 더 깨끗한 차트에 대해 y 축을 생략할 수 있습니다.
theme(
axis.text.y=element_blank(), axis.ticks=element_blank(),
axis.title.y=element_blank()
)
변수가 연속이면 함수가 변수를 "빈"별로 그룹화하므로 geom_histogram()을 사용해야 합니다.
df <- data.frame(V1 = rnorm(100))
ggplot(df, aes(x = V1)) +
geom_histogram(aes(y = 100*(..count..)/sum(..count..)))
# if you use geom_bar(), with factor(V1), each value of V1 will be treated as a
# different category. In this case this does not make sense, as the variable is
# really continuous. With the hp variable of the mtcars (see previous answer), it
# worked well since hp was not really continuous (check unique(mtcars$hp)), and one
# can want to see each value of this variable, and not to group it in bins.
ggplot(df, aes(x = factor(V1))) +
geom_bar(aes(y = (..count..)/sum(..count..)))
다음은 패싯 데이터에 대한 해결 방법입니다. (@Andrew에서 허용한 답변은 이 경우에는 적용되지 않습니다.)이 아이디어는 dplyr를 사용하여 백분율 값을 계산한 다음 geom_col을 사용하여 그림을 만드는 것입니다.
library(ggplot2)
library(scales)
library(magrittr)
library(dplyr)
binwidth <- 30
mtcars.stats <- mtcars %>%
group_by(cyl) %>%
mutate(bin = cut(hp, breaks=seq(0,400, binwidth),
labels= seq(0+binwidth,400, binwidth)-(binwidth/2)),
n = n()) %>%
group_by(cyl, bin) %>%
summarise(p = n()/n[1]) %>%
ungroup() %>%
mutate(bin = as.numeric(as.character(bin)))
ggplot(mtcars.stats, aes(x = bin, y= p)) +
geom_col() +
scale_y_continuous(labels = percent) +
facet_grid(cyl~.)
줄거리는 이렇습니다.
ggplot2 버전 3.3 이후로, 우리는 편리함을 이용할 수 있습니다.after_stat()
기능.
할 수 있지만 @Andrew 의, 라는 는 않습니다...
구문:
# original example data
mydata <- c("aa", "bb", NULL, "bb", "cc", "aa", "aa", "aa", "ee", NULL, "cc")
# display percentages
library(ggplot2)
ggplot(mapping = aes(x = mydata,
y = after_stat(count/sum(count)))) +
geom_bar() +
scale_y_continuous(labels = scales::percent)
"" 를의 할 수 "찾을 수 .geom_
그리고.stat_
기능들.예를 들어, 의 경우geom_bar()
, 당신은 접속할 수 있습니다.count
그리고.prop
변수들.(계산된 변수는 설명서 참조)
에 .NULL
값: 벡터를 생성할 때 무시됩니다(즉, 길이가 11이 아닌 9인 벡터로 끝남).다를 .NA
대신 (ggplot2는 NA를 그림의 오른쪽 끝에 배치합니다):
# use NA instead of NULL
mydata <- c("aa", "bb", NA, "bb", "cc", "aa", "aa", "aa", "ee", NA, "cc")
length(mydata)
#> [1] 11
# display percentages
library(ggplot2)
ggplot(mapping = aes(x = mydata,
y = after_stat(count/sum(count)))) +
geom_bar() +
scale_y_continuous(labels = scales::percent)
2021-02-09년 repex 패키지에서 생성(v1.0.0)
를 합니다.chr
아니면fct
데이터는 예제에 영향을 주지 않습니다.)
백분율 레이블을 사용하지만 실제 N은 y 축에 표시하려면 다음을 시도합니다.
library(scales)
perbar=function(xx){
q=ggplot(data=data.frame(xx),aes(x=xx))+
geom_bar(aes(y = (..count..)),fill="orange")
q=q+ geom_text(aes(y = (..count..),label = scales::percent((..count..)/sum(..count..))), stat="bin",colour="darkgreen")
q
}
perbar(mtcars$disp)
언급URL : https://stackoverflow.com/questions/3695497/show-percent-instead-of-counts-in-charts-of-categorical-variables
'source' 카테고리의 다른 글
jQuery로 키 누르기 시뮬레이션 (0) | 2023.10.09 |
---|---|
서버에서 도메인 간 요청을 활성화하는 방법은? (0) | 2023.10.09 |
Pandas 데이터 프레임에서 여러 열 값을 하나의 열로 연결하는 방법 (0) | 2023.10.04 |
WordPress: 미디어 오류:형식이 지원되지 않거나 원본을 찾을 수 없습니다. (0) | 2023.10.04 |
WooCommerce 카트 및 체크아웃에서 상품 가격 변경 (0) | 2023.10.04 |