2017-11-24 21 views
1

두 번째 범주 형 변수에 따라 분류 된 범주 형 변수 ggplot2를 바 플롯하고 facet_wrap을 사용하여 서로 다른 플롯에서 구분합니다. 각 비율을 표시합니다. 여기에 재현 가능한 예gplplot과 gplot 두 번째 범주 변수의 facet_wrap 두 번째 변수 표시율에 따라

test <- data.frame(
    test1 = sample(letters[1:2], 100, replace = TRUE), 
    test2 = sample(letters[3:5], 100, replace = TRUE), 
    test3 = sample(letters[9:11],100, replace = TRUE) 
) 


ggplot(test, aes(x=factor(test1))) + 
    geom_bar(aes(fill=factor(test2), y=..prop.., group=factor(test2)), position="dodge") + 
    facet_wrap(~factor(test3))+ 
    scale_y_continuous("Percentage (%)", limits = c(0, 1), breaks = seq(0, 1, by=0.1), labels = percent)+ 
    scale_x_discrete("")+ 
    theme(plot.title = element_text(hjust = 0.5), panel.grid.major.x = element_blank()) 

이렇게하면 각 테스트 3에서 test1에 따라 test2의 비율로 막대 그래프가 표시됩니다. 상단에 각 막대의 백분율을 표시하고 싶습니다. 또한, 오른쪽의 범례 이름을 Test2의 factor (test2)에서 변경하고 싶습니다.

enter image description here

답변

2

그것은 당신이 당신이 원하는 비율 레이블 열을 만들 수 있도록 데이터 요약을 직접 수행하는 것이 가장 쉬운 방법 일 수 있습니다. (사실, 나는 당신이 당신의 백분율을 패싯 i, 그룹 b, 거의 90 % 인 컬럼과 50 %보다 크거나 같은 두 컬럼에서 보여주기를 원하는지 잘 모르겠다. ? 그 목적)

라이브러리 및 예제 데이터 프레임 :

library(ggplot2) 
library(dplyr) 

test <- data.frame(
    test1 = sample(letters[1:2], 100, replace = TRUE), 
    test2 = sample(letters[3:5], 100, replace = TRUE), 
    test3 = sample(letters[9:11],100, replace = TRUE) 
) 

, 모든 열 (순서주의)에 의해 그룹은 다음 lengthtest2의를 얻을 요약한다. Mutate 여기에서 열 높이와 레이블 값을 얻으려면 여기에 100을 곱하고 반올림했습니다.

test.grouped <- test %>% 
    group_by(test1, test3, test2) %>% 
    summarize(t2.len = length(test2)) %>% 
    mutate(t2.prop = round(t2.len/sum(t2.len) * 100, 1)) 

> test.grouped 
# A tibble: 18 x 5 
# Groups: test1, test3 [6] 
    test1 test3 test2 t2.len t2.prop 
    <fctr> <fctr> <fctr> <int> <dbl> 
1  a  i  c  4 30.8 
2  a  i  d  5 38.5 
3  a  i  e  4 30.8 
4  a  j  c  3 20.0 
5  a  j  d  8 53.3 
... 

는 레이블로 비율 열을 사용하는 geom_text을 사용하여 플롯을 구축하기 위해 요약 된 데이터를 사용

ggplot(test.grouped, aes(x = test1, 
         y = t2.prop, 
         fill = test2, 
         group = test2)) + 
    geom_bar(stat = "identity", position = position_dodge(width = 0.9)) + 
    geom_text(aes(label = paste(t2.prop, "%", sep = ""), 
       group = test2), 
      position = position_dodge(width = 0.9), 
      vjust = -0.8)+ 
    facet_wrap(~ test3) + 
    scale_y_continuous("Percentage (%)") + 
    scale_x_discrete("") + 
    theme(plot.title = element_text(hjust = 0.5), panel.grid.major.x = element_blank()) 

enter image description here

+0

감사를 당신의 대답. 그것은 내 필요성에 부합하고 내 문제를 해결합니다. 백분율의 합이 100과 다른 것을 피하는 방법은 무엇입니까? 나는 그것이 함수 라운드의 결과라고 이해하지만, 어떤 해결책이 있다면 나는 생각하고 있었다. 고마워요. – ChinaskyM

+0

@ChinaskyM - 물론, '돌연변이'가있는 초기 계산에서 'round'를 사용하지 않으면보다 정확한 값이 보존됩니다. 플롯 자체에 표시하고자하는 소수점 자리는 얼마나보기 좋을지에 따라 달라질 수 있지만, 초기 계산에서 반올림하지 않으면'geom_text()'호출에서'round'를 사용하여 놀 수 있습니다 . –

+0

큰 충고. 정말 고마워. – ChinaskyM