본문 바로가기
실용적인프로그래밍/R

[R] ggplot package boxplot 그리기

by 인포메틱스 2021. 1. 13.
반응형

 

 ggplot2 package는 R에서 대표적인 그래프를 만드는 패키지로 여러가지 package를 만들 수가 있습니다.

 

이번 포스팅에는 그중에서 boxplot 그림을 그리는 것에 대한 이야기를 할까 합니다.

 

boxplot의 기본적인 내용(상자그래프, 상자수염그래프)은 다른 사이트에 자세히 나오니 패스를 하도록 하겠습니다.

 

boxplot을 그리는 이유그룹간 차이를 시각적으로 보여주기 위함입니다.

 

데이터는 ggplot2의 데이터베이스인 diamonds를 이용할 것 입니다.

 

ggplot에서 boxplot을 그리는 기본적인 구조는 다음과 같습니다.

 

ggplot(data=diamonds,aes(x=cut ,y=price))+geom_boxplot()
ggplot(data=diamonds)+geom_boxplot()+aes(x=cut ,y=price)
ggplot(data=diamonds)+list(geom_boxplot(),aes(x=cut,y=price))

 

위 세가지는 아래 그림을 나타내는 코드입니다. (세개중 편한것 하나만 알고 있으면 됩니다.

(아래에 나오는 예시들에는 첫번째 기본적인 구조를 이용하여 예시를 들도록 하겠습니다.)

 

 

 여기서 boxplot을 눕히고 싶다! 할 경우 다음과 같이 코드를 짜면 됩니다.

 

ggplot(data=diamonds,aes(x=cut ,y=price))+geom_boxplot()+coord_flip()
ggplot(data=diamonds,aes(x=price ,y=cut))+geom_boxplot()

뭔가 둥글게 만들고 싶다 할 경우 다음과 같이 코드를 짜면 됩니다. (circular boxplot)

(다른 그래프에도 적용이 가능합니다. 뭔가 '+'를 붙였다 싶으면 다른 그래프에도 적용이 가능한 것입니다.)

 

ggplot(data=diamonds,aes(x=cut ,y=price))+geom_boxplot()+coord_polar()

 

 

 

Outlier 다루기

 

outlier를 시각적으로 처리하기에는 정말 귀찮은 경향이 있습니다. 

 

outlier는 다음과 같이 geom_boxplot내부에 outlier option만으로 처리가 가능합니다.

 

library(gridExtra)
p1<-ggplot(data=diamonds,aes(x=cut ,y=price))+geom_boxplot(outlier.colour = 'red')
p2<-ggplot(data=diamonds,aes(x=cut ,y=price))+geom_boxplot(outlier.shape = 21,outlier.fill = 'red')
p3<-ggplot(data=diamonds,aes(x=cut ,y=price))+geom_boxplot(outlier.shape = 11)
p4<-ggplot(data=diamonds,aes(x=cut ,y=price))+geom_boxplot(outlier.alpha = 0)
p5<-ggplot(data=diamonds,aes(x=cut ,y=price))+geom_boxplot(outlier.alpha = 0.005)
p6<-ggplot(data=diamonds,aes(x=cut ,y=price))+geom_boxplot(outlier.size = 20)
p7<-ggplot(data=diamonds,aes(x=cut ,y=price))+geom_boxplot(outlier.stroke = 5)
grid.arrange(p1,p2,p3,p4,p5,p6,p7,nrow=3,ncol=3)

 

1,2번의 경우 색을 변경할 수가 있고, (2번의 경우 내부 색을 변경할 수 있는 point shape만 가능

 

3번의 경우 outlier 모양을 변경하는 것이고,

 

4,5 번의 경우 alpha 값을 조정함으로서 outlier를 없애거나 희미하게 할 수가 있습니다. (outlier.shape = NA도 가능) alpha값은 ggplot2에서 대부분 희미하게 처리할때 사용합니다.

 

6,7 번의 경우 outlier의 크기를 조절할 수가 있습니다. (outlier.stroke의 경우 무슨 의미인지 모르겠으나, 크기가 조절되네요)

 

중앙값 신뢰구간 확인하기

중앙값의 신뢰구간 확인하는 방법은 쉽게 notch=T를 추가해주면 됩니다.

 

ggplot(data=diamonds,aes(x=cut ,y=price))+geom_boxplot(notch=T)

 

 

중앙값의 신뢰구간을 보는 이유outlier가 많이 있을때, 그룹간 대략적인 비교를 할때에는 평균보다는 이러한 중앙값을 이용하는데 이러한 신뢰구간에 따라 그룹의 차이를 확인할 수가 있습니다.

 

특정 데이터만 가지고 오고 싶을 경우(cut에서 Fair화 Ideal만 가져오기.)와 boxplot 내에 데이터를 점으로 표시하고 싶을 경우 다음과 같이 진행하면됩니다.

 

p1<-ggplot(data=diamonds,aes(x=cut ,y=price))+geom_boxplot()+scale_x_discrete(limits=c('Fair','Ideal'))
p2<-ggplot(data=diamonds,aes(x=cut ,y=price))+geom_boxplot()+geom_jitter()
p3<-ggplot(data=diamonds,aes(x=cut ,y=price))+geom_boxplot()+geom_dotplot(binaxis = 'y',stackdir='center',dotsize=0.1)
grid.arrange(p1,p2,p3,ncol=3)

 

2,3번째의 경우 데이터가 많기 때문에 저렇게 나오는 것입니다. (size조절 혹은 저럴경우 dotplot은 사용하지 않는게 낫네요)

 

그리고 boxplot에 색을 넣기 위해서는 다음과 같이 하면됩니다. (fill 지정을 해주면 됩니다.)

 

p1<-ggplot(data=diamonds,aes(x=cut ,y=price))+geom_boxplot(color='red',fill='blue')
p2<-ggplot(data=diamonds,aes(x=cut ,y=price,fill=cut))+geom_boxplot()
p3<-ggplot(data=diamonds,aes(x=cut ,y=price,fill=cut))+geom_boxplot()+scale_fill_manual(values = c('red','orange','brown','yellow','blue'))
p4<-ggplot(data=diamonds,aes(x=cut ,y=price,fill=cut))+geom_boxplot()+scale_fill_brewer(palette = 'Blues')
p5<-ggplot(data=diamonds,aes(x=cut ,y=price,fill=cut))+geom_boxplot()+scale_fill_grey()
grid.arrange(p1,p2,p3,p4,p5,nrow=2)

 

옆에 레전드의 위치는 다음과 같이 변경해주면 됩니다.

 

p1<-ggplot(data=diamonds,aes(x=cut ,y=price,fill=cut))+geom_boxplot()
p2<-ggplot(data=diamonds,aes(x=cut ,y=price,fill=cut))+geom_boxplot()+theme(legend.position = 'top')
p3<-ggplot(data=diamonds,aes(x=cut ,y=price,fill=cut))+geom_boxplot()+theme(legend.position = 'bottom')
p4<-ggplot(data=diamonds,aes(x=cut ,y=price,fill=cut))+geom_boxplot()+theme(legend.position = 'none')
grid.arrange(p1,p2,p3,p4,nrow=2)

 

 

 

그리고 각 cut 등급에서 color에 따른 가격을 볼 경우 다음과 같이 하면 됩니다.

(앞서 설명했던 내용들을 여럿 적용시켜보았습니다.)

 

p1<-ggplot(data=diamonds,aes(x=cut ,y=price,fill=color))+geom_boxplot()
p2<-ggplot(data=diamonds,aes(x=cut ,y=price,fill=color))+geom_boxplot(notch=T)
p3<-ggplot(data=diamonds,aes(x=cut ,y=price,fill=color))+geom_boxplot()+geom_jitter(size=0.1)
p4<-ggplot(data=diamonds,aes(x=cut ,y=price,fill=color))+geom_boxplot(outlier.colour = 'red',outlier.size=1)
p5<-ggplot(data=diamonds,aes(x=cut ,y=price,fill=color))+geom_boxplot()+coord_polar()
grid.arrange(p1,p2,p3,p4,p5,nrow=3)

 

 

 


여기까지 ggplot에서 boxplot에 대한 내용에 대한 포스팅을 완료하였습니다.

 

감사합니다.

 

궁금한점이나 잘못된점이 있다면 댓글로 문의 바랍니다! 

728x90
반응형

댓글