R 언어 : 다중 카테고리 boxplot + jitterplot 문제

6758 단어 ggplot2Rboxplotjitter
마지막 연속.
끼워 넣은 것은 개인으로부터.

일어난 일



boxplot+jitterplot로 보여주거든 t 검정하라고 말하지 않는다는 것을 이해한 와이.
한쪽 끝에서 box jitter하고 있었던 것이다.
문제는 결손 범주가 나타날 때 발생했습니다.
ggsave2 <- function(plot, wid=9, hei=9){
  plot_name <- deparse(substitute(plot))
  file_name <- paste(plot_name, ".png", sep = "",collapse = "")
  ggsave(filename = file_name,plot = plot,device = "png",width = wid, height = hei,dpi = 300,units = "cm")
}

dmd <- diamonds %>%
  dplyr::filter(!as.character(cut) %in% c("Fair", "Good")) %>%
  dplyr::filter(as.character(color) %in% c("G", "H", "I")) %>%
  .[sample(x = 1:nrow(.), size = 500, replace = F),]

라고 한다.
ggsave2는 그대로 저장하는 함수이다.
dmd %>%
  head()

A tibble: 6 x 10



carat cut color clarity depth table price x y z

1 0.52 Ideal H VS1 61 56 1699 5.15 5.23 3.17
2 0.61 Ideal I SI2 61.1 57 1401 5.46 5.49 3.34
3 0.31 Premium H VVS2 62.6 60625 4.29 4.33 2.7
4 0.54 Very Good G SI1 63.8 57 1392 5.16 5.19 3.3
5 0.33 Ideal G IF 61 57925 4.45 4.48 2.72
6 1.1 Ideal G SI1 62.3 56 5226 6.64 6.58 4.12

간단하게는 diamonds의 카테고리 변수 cut와 color를 조금 짜냈다.
이미지로서는 카테고리 변수의 조합으로서 10가지 이하 정도가 있는 상태를 생각해 주었으면 한다.

전회의 box+jitter하면 이렇다.
p_boxjit <- ggplot()+theme_light()+
  geom_boxplot(data = dmd,
               aes(x=cut, y=carat), outlier.shape = NA)+
  geom_jitter(data = dmd,
               aes(x=cut, y=carat),
              color="red", size=0.7)
ggsave2(p_boxjit)



그런데, 두 개의 카테고리 변수의 조합의 수가 그다지 많지 않다면, 하나의 box jitter로 보고 싶다.
일단 이렇게 하면 할 수 있다.
pallet_ad_man <- c("#e41a1c",
                   "#377eb8",
                   "#4daf4a")
pallet_ad_white <- c("#ffffff",
                     "#ffffff",
                     "#ffffff")

p_bj2 <-  ggplot()+theme_light()+
  geom_boxplot(data = dmd,
               aes(x=cut, y= carat, fill=color),
               outlier.colour = NA)+
  scale_fill_manual(values = pallet_ad_white)+
  geom_point(data = dmd,
             aes(x=cut, y=carat, color=color),
             position = position_jitterdodge(jitter.width = 0.7), size=0.6)+
  scale_color_manual(values = pallet_ad_man)

ggsave2(p_bj2, wid = 15)

결과는 이렇다.



일단 해설을 하면,
boxplot의 색은 pallete_ad_white로 전부 백색으로 지정해,
jitter plot은 geom_point로 표현하고 있다.
에서 카테고리 변수에 의한 수평 배치는 positon_jitterdodge로 실현한다.

pallet_ad_man은 포인트에서 색조를하고 있습니다.
이것은 완전하게 좋아한다.
다만, 백색 백에 노란색 점이라도 보기 어렵기 때문에 적당하게 조정했다.

여기까지는 좋을 것이다.
문제는 여기에서다.

특정 조합에 결함이 있으면 어떻게됩니까? . .
dmd_lack <- dmd %>%
  dplyr::filter(!(cut == "Ideal" & (color %in% c("G", "I")))) 

p_bj3 <-  ggplot()+theme_light()+
  geom_boxplot(data = dmd_lack,
               aes(x=cut, y= carat, fill=color),
               outlier.colour = NA)+
  scale_fill_manual(values = pallet_ad_white)+
  geom_point(data = dmd_lack,
             aes(x=cut, y=carat, color=color),
             position = position_jitterdodge(jitter.width = 0.7), size=0.6)+
  scale_color_manual(values = pallet_ad_man)

ggsave2(p_bj3, wid = 15)


Ideal군에서 G, I가 되는 row가 존재하지 않는다. 그러면 결과로서는 이하다.



음 아름답지 않아.
Ideal만 헛되게 가로가 되어 버려, 전혀 기쁘지 않다.

boxplot만이라면, 아래와 같이 할 수 있다.
p_b3 <- ggplot()+theme_light()+
  geom_boxplot(data = dmd_lack,
               aes(x=cut, y= carat, fill=color),
               position = position_dodge2(preserve = "single",
                                          width = 0.5),
               outlier.colour = NA)
ggsave2(p_b3, wid =12)



하지만 boxplot 그럼 부족하다.
p_bj4 <-  ggplot()+theme_light()+
  geom_boxplot(data = dmd_lack,
               aes(x=cut, y= carat, fill=color),
               position = position_dodge2(preserve = "single",
                                          width = 0.5),
               outlier.colour = NA)+
  scale_fill_manual(values = pallet_ad_white)+
  geom_point(data = dmd_lack,
             aes(x=cut, y=carat, color=color),
             position = position_jitterdodge(jitter.width = 0.7), size=0.6)+
  scale_color_manual(values = pallet_ad_man)
ggsave2(p_bj4, wid = 15)




이것이 원하는 그림이다.
ggplot2의 버전 등에서는 잘 오징어가 없는 것 같다.

또 다른 방법은 누락 된 카테고리를 플롯해야하는 범위를 벗어난 값으로 채우는 방법입니다.
dmd_lack_fix <- dmd_lack %>%
  mutate(cut = factor(as.character(cut),
                      levels = c("Very Good", "Premium", "Ideal")),
         color = factor(as.character(color), 
                        levels = c("G", "H", "I"))) %>%
  tidyr::complete(cut, color, fill = list(carat = -100))

무엇을 하고 있는가 하면,
tidyr::complete로 결측 카테고리를 채우는데,
개별의 결손 카테고리는, cut가 Fair라든지, color가 A, 같은 것도 충전되어 버리기 때문에,
코드 중의 카테고리만이라도 팩터의 재실행을 하고 있다.
그럼 컴플리트군요.

이 근처 굉장히 추상도가 낮고 싫어지지만, 여기서는 용서해 주었으면 한다.
p_bj5 <-  ggplot()+theme_light()+
  geom_boxplot(data = dmd_lack_fix,
               aes(x=cut, y= carat, fill=color),
               outlier.colour = NA) +
  scale_fill_manual(values = pallet_ad_white)+
  geom_point(data = dmd_lack_fix,
             aes(x=cut, y=carat, color=color),
             position = position_jitterdodge(jitter.width = 0.7), size=0.6)+
  scale_color_manual(values = pallet_ad_man)+
  coord_cartesian(ylim = c(0.2, 2.7))
ggsave2(p_bj5, wid=15)




했어.

좋은 웹페이지 즐겨찾기