본문 바로가기

R_statistics/Rs_graphics

[R프로그래밍] 데이터시각화 with ggplot2::sec_axis, dual axis graph, 2개의 축을 가진 그래프 그리기

데이터를 제시할때, 한개의 그래프 안에 2가지의 자료를 함께 보여주고 싶을 때가 있습니다.

이러한 경우, 2가지 자료의 단위 혹은 값이 상당히 다르다면, 

한개의 그래프 안에 2개의 자료를 모두 제시하였을 때, 2개의 자료가 따로따로 떨어져서 보여지겠죠?


Iris 데이터를 이용하여 Sepal.Length 와 Petal.Length 의 분포를 하나의 그래프에 그린다고 가정해보겠습니다.

극적인 효과를 위하여, Petal.Width 의 값을 전체적으로 1/10 로 감소시켜서 그래프를 그려보겠습니다.


Sepal.Length 의 분포는 boxplot 을 이용하여 Species 별로 나타내고,

Petal.Width 의 분포는 dot plot 을 이용하여 Species 별로 나타내겠습니다.




일반적인 방식으로 나타내면 아래와 같은 모양이 그려지게 됩니다.


위의 그래프에서 볼 수 있듯이 

두 변수의 값이 상당한 차이를 보이기 때문에 petal.width 같은 경우는 아래에만 밀집해서 분포하게 됩니다.

종별에 따른 차이를 쉽게 알아보기가 어렵죠. 


참고로 위의 그래프의 코딩은 다음과 같습니다.


library(ggplot2)

iris
colnames(iris) <- tolower(colnames(iris))
iris$petal.width<-iris$petal.length/10 


part3<- ggplot(iris, aes(species, sepal.length, colour=species))+
  geom_boxplot(alpha=.7)+
  geom_point(data=iris, aes(x=species, y= petal.width, alpha=.7), position="jitter")+
  theme_bw()+
  theme(legend.position = "top")
part3



이러한 문제를 해결하기 위한 방법이 바로 max ratio 를 이용한 dual axis 입니다.  

만일 petal.width 의 axis 를 우측축으로 새롭게 지정하여 분포를 그려 주는 것입니다. 

결과물은 이런식으로 그려지게 됩니다. 




어떤가요 ?

서로 다른 자료의 분포가 더 직관적으로 이해가 되지 않으시나요?

ggplot2 의 sec_axis 라는 명령어를 사용하여 위의 그래프를 그릴 수가 있습니다.


코드는 아래와 같습니다.


한가지 주의할 사항이라면, 

sec_axis 축을 지정할 때, 좌/우 축의 max 값의 비율을 이용하여 축의 비율을 조절해줘야한다는 것입니다.

6, 7번줄의 y 값과 sex_axis 의 코드를 잘 살펴보시면 어떠한 원리인지는 쉽게 이해되실거에요^^


part1<- ggplot(iris, aes(species, sepal.length, colour=species))+
  geom_boxplot(alpha=.7)+
  theme_bw()+
  theme(legend.position = "top")
part1
part2 <- part1+ geom_point(data=iris, aes(x=species, y= petal.width * max(iris$sepal.length)/max(iris$petal.width)), alpha=.7, position="jitter")+
  scale_y_continuous( sec.axis = sec_axis(~ . *  (max(iris$petal.width)/ max(iris$sepal.length)), name = "petal.width"))+
  theme(legend.position = "top")+
  labs(x="species", y="sepal.length")
part2


참 쉽죠 ? ^^


도움이 되셨다면, '공감' 버튼 부탁드립니다^^