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() 함수 등을 사용하면 축의 이름을 자유롭게 변경할 수 있다.
'R > ggplot2(시각화)' 카테고리의 다른 글
[R] ggplot2 (6) 히스토그램, 상자 그래프 (0) | 2022.11.30 |
---|---|
[R] ggplot2 (5) 범주형 변수의 통계 요약 (0) | 2022.11.30 |
[R] ggplot2 (3) 측면(facets)으로 나누어 그리기 (0) | 2022.11.30 |
[R] ggplot2 (2) Group 속성 (0) | 2022.11.30 |
[R] ggplot2 (1) 그래프 그리기 (0) | 2022.11.30 |