Data Analysis

R/ggplot2(시각화)

[R] ggplot2 (4) 그래프 계층(layers)과 도형(geoms)

Holy_Water 2022. 11. 30. 11:06

ggplot2의 장점은 필요에 따라 다양한 형식의 그래프를 쉽게 만들 수 있고, 만들 수 있는 형식도 무궁무진하다는데 있다. ggplot2 그래프의 계층적 구조와 데이터 열과 속성을 자유롭게 매핑할 수 있다는 점이 이러한 무궁무진한 그래프 형식을 만들어 내는 핵심 요소라 할 수 있다.

 

 

geom 함수의 순서와 그래프 계층

ggplot2는 좌표평면 위에 여러 계층으로 그래프를 그려서 하나의 좌표평명에 나타냄으로써 복잡한 형식의 그래프를 만들어 낼 수 있다.

다음 두 그래프에서는 배기량과 고속도로 연비의 산점도와 추세선을 각각 그렸다.

> ggplot() + geom_point(mapping=aes(x=displ, y=hwy), data=mpg)

> ggplot() + geom_smooth(mapping=aes(x=displ, y=hwy), data=mpg)
`geom_smooth()` using method = 'loess' and formula 'y ~ x'

위의 두 그래프는 다음처럼 한 좌표평면 위에 겹쳐서 그릴 수 있다. ggplot2에서 서로 다른 geom 함수는 서로 다른 도형-앞의 예는 점과 추세선-을 그래프에 표시한다.

ggplot() 함수가 여러 개의 geom 함수와 연결되면, 하나의 좌표평면에 각각의 geom() 함수의 결과를 층층이 그린다. 이 때, 명령문에 나타나는 순서에 따라 첫번째 나온 geom 함수의 도형이 가장 아래 계층에, 다음에 나오는 geom 함수의 도형이 차례로 그 윗 계층에 그려진다.

> ggplot() + 
+   geom_point(mapping=aes(x=displ, y=hwy), data=mpg) +
+   geom_smooth(mapping=aes(x=displ, y=hwy), data=mpg)
`geom_smooth()` using method = 'loess' and formula 'y ~ x'

ggplot() 함수는 좌표축을 자동 조정한다.

만약 위의 그래프에 배기량과 도심연비의 산점도와 추세선을 겹쳐서 표시하려면 다음처럼 네 계층으로 이루어진 그래프를 그린다. ggplot() 함수가 데이터에 따라 좌표평면의 범위를 자동적으로 조정하는 것을 볼 수 있다.

> ggplot() + 
+   geom_point(mapping=aes(x=displ, y=hwy), data=mpg) +
+   geom_smooth(mapping=aes(x=displ, y=hwy), data=mpg) + 
+   geom_point(mapping=aes(x=displ, y=cty), data=mpg, col="red", shape=1) +
+   geom_smooth(mapping=aes(x=displ, y=cty), data=mpg, linetype=2, col="red")
`geom_smooth()` using method = 'loess' and formula 'y ~ x'
`geom_smooth()` using method = 'loess' and formula 'y ~ x'

 

 

 

여러 데이터를 사용하여 그래프 계층 만들기

지금까지는 동일한 데이터(data)에 대해서 geom 함수들이 그래프를 그렸다. 그러나 사실 각 계층의 geom 함수가 이용할 data와 mapping을 독립적으로 설정할 수 있다.

다음 예는 mpg 데이터와 함께 R의 기본 패키지에서 제공하는 iris 데이터를 사용하여 그래프를 그려보자.

> head(iris)
  Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1          5.1         3.5          1.4         0.2  setosa
2          4.9         3.0          1.4         0.2  setosa
3          4.7         3.2          1.3         0.2  setosa
4          4.6         3.1          1.5         0.2  setosa
5          5.0         3.6          1.4         0.2  setosa
6          5.4         3.9          1.7         0.4  setosa

iris 데이터는 꽃받침의 길이(‘Sepal.Length’)와 폭(‘Sepal.Width’) 열을 가지고 있는데, 이 두 열의 산점도를 앞의 그래프에 겹쳐서 그려보았다.

> ggplot() + 
+   geom_point(mapping=aes(x=displ, y=hwy), data=mpg) +
+   geom_smooth(mapping=aes(x=displ, y=hwy), data=mpg) + 
+   geom_point(mapping=aes(x=displ, y=cty), data=mpg, col="red", shape=1) +
+   geom_smooth(mapping=aes(x=displ, y=cty), data=mpg, linetype=2, col="red") +
+   geom_point(mapping=aes(x=Sepal.Length, y=Sepal.Width), data=iris, col="orange") 
`geom_smooth()` using method = 'loess' and formula 'y ~ x'
`geom_smooth()` using method = 'loess' and formula 'y ~ x'

물론 이 그래프는 배기량과 꽃받침의 길이를 같은 x-축으로, 고속도로 연비와 꽃받침의 폭을 같은 y-축으로 그래프를 그렸으므로 억지스러운 측면이 있다. 단지 아주 별개의 데이터를 동시에 사용해서 하나의 그래프를 그릴 수 있다는 것을 보여주기 위해 그린 그래프일 뿐이다.

그러나 이 예에서 다음 사실을 확인할 수 있다. 

첫째, 서로 다른 데이터를 사용해도 좌표평면이 자동으로 조정되어 모든 계층의 도형이 모두 적절히 표시된다. 

둘째, 아울러 축의 이름은 첫 계층의 geom 함수의 x와 y로 대응된 변수가 자동으로 선택된다. 뒤에서 보겠지만 labs() 함수 등을 사용하면 축의 이름을 자유롭게 변경할 수 있다.