====================
그래픽 문법(Grammar of Graphics)은 릴랜드 윌킨스(Leland Wilkinson)의 책 The Grammar of Graphics에서 따온 것으로써, 데이터를 어떻게 표현할 것인지에 대한 내용입니다.
Leland Wilkinson, 《The Grammar of Graphics》
그래픽 문법에서 말하는 요소는 다음과 같습니다.
- Data: 시각화에 사용될 데이터
- Aesthetics: 데이터를 나타내는 시각적인 요소(x축, y축, 사이즈, 색깔, 모양 등)
- Geometrics: 데이터를 나타내는 도형
- Facets: 하위 집합으로 분할하여 시각화
- Statistics: 통계값을 표현
- Coordinates: 데이터를 표현 할 이차원 좌표계
- Theme: 그래프를 꾸밈
ggplot2 패키지의 앞글자가 gg인 것에서 알 수 있듯이, 해당 패키지는 그래픽 문법을 토대로 시각화를 표현하며, 전반적인 시각화의 순서는 위의 순서와 같습니다.
ggplot2 패키지의 특징은 각 요소를 연결할 때 플러스(+) 기호를 사용한다는 점이며, 이는 그래픽 문법의 순서에 따라 요소들을 쌓아나간 후 최종적인 그래픽을 완성하는 패키지의 특성 때문입니다.
1. Data, Aesthetics, Geometrics
library(ggplot2) data(diamonds) head(diamonds) ## # A tibble: 6 x 10 ## carat cut color clarity depth table price x y z ## 1 0.23 Ideal E SI2 61.5 55 326 3.95 3.98 2.43 ## 2 0.21 Premium E SI1 59.8 61 326 3.89 3.84 2.31 ## 3 0.23 Good E VS1 56.9 65 327 4.05 4.07 2.31 ## 4 0.290 Premium I VS2 62.4 58 334 4.2 4.23 2.63 ## 5 0.31 Good J SI2 63.3 58 335 4.34 4.35 2.75 ## 6 0.24 Very Good J VVS2 62.8 57 336 3.94 3.96 2.48
ggplot2 패키지를 불러온 후, 기본적으로 제공되는 다이아몬드 데이터를 불러오도록 하겠습니다. 데이터의 각 변수는 다음과 같습니다.
- carat: 다이아몬드 무게
- cut: 컷팅의 가치
- color: 다이아몬스 색상
- clarity: 깨끗한 정도
- depth: 깊이 비율, z / mean(x, y)
- table: 가장 넓은 부분의 너비 대비 다이아몬드 꼭대기의 너비
- price: 가격
- x: 길이
- y: 너비
- z: 깊이
먼저 가장 중요한 Data와 Aesthetics를 정의해주도록 하겠습니다.
ggplot(data = diamonds, aes(x = carat, y = price))
- ggplot() 함수 내부의 data에 diamonds를 지정해줍니다.
- aes() 함수를 통해 데이터를 매핑해주며 x축에 carat을, y축에 price를 지정해줍니다.
x축과 y축에 우리가 매핑한 carat과 price가 표현되었지만, 어떠한 모양(Geometrics)으로 시각화를 할지 정의하지 않았으므로 빈 그림이 생성됩니다. 다음으로 Geometrics을 통해 데이터를 그림으로 표현해주도록 하겠습니다.
ggplot(data = diamonds, aes(x = carat, y = price)) + geom_point()
Data와 Aesthetics을 정의한 후, 플러스(+) 기호를 통해 geom_point() 함수를 입력하여 산점도가 표현되었습니다. geom은 Geometrics의 약자이며, 이처럼 geom_*() 함수를 통해 원하는 형태의 시각화를 할 수 있습니다.
library(magrittr) diamonds %>% ggplot(aes(x = carat, y = price)) + geom_point()
일반적으로 Data는 ggplot() 함수 내에서 정의하기 보다는, 일반적으로 dplyr 패키지의 함수들을 이용하여 데이터를 가공한 후 파이프 오퍼레이터를 통해 연결합니다.
diamonds %>% ggplot(aes(x = carat, y = price)) + geom_point(aes(color = cut))
geom_point() 내부에서 aes()를 통해 점의 색깔을 매핑해줄 수 있습니다. color = cut을 지정하여 cut에 따라 점의 색깔이 다르게 표현됩니다. 이 외에도 shape, size를 통해 모양과 크기를 각각 다르게 표현할 수 있습니다.
2. Facets
Facets은 여러 집합을 하나의 그림에 표현하기 보다 하위 집합으로 나누어 시각화하는 요소입니다.
diamonds %>% ggplot(aes(x = carat, y = price)) + geom_point() + facet_grid(. ~ cut)
facet_grid() 혹은 facet_wrap() 함수를 통해 그림을 분할할 수 있습니다. 물결 표시(~)를 통해 하위 집합으로 나누고자 하는 변수를 선택할 수 있으며, 위 예제에서는 cut에 따라 각기 다른 그림으로 표현되었습니다.
3. Statistics
Statistics는 통계값을 나타내는 요소입니다.
diamonds %>% ggplot(aes(x = carat, y = price)) + geom_point(aes(color = cut)) + geom_smooth(method = 'lm')
geom_smooth() 함수를 통해 평활선을 추가해주며, 방법으로 lm(linear model)을 지정할 경우 선형회귀선을 그려주게 됩니다. 이 외에도 glm, gam, loess 등의 다양한 회귀선을 그려줄 수 있습니다.
diamonds %>% ggplot(aes(x = cut, y = carat)) + stat_summary_bin(fun.y = 'mean', geom = 'bar')
stat_summary_*() 함수를 사용하여 통계값을 직접 표현할 수도 있습니다. cut에 따른 carat의 평균값을 구하고자 할 경우, fun.y에 mean을 입력하여 평균값을 구하고, geom에 bar를 입력하여 막대그래프 형태로 표현하였습니다.
4. Coordinates
Coordinates는 좌표를 의미합니다. ggplot2에서는 coord_*() 함수를 이용하여 x축 혹은 y축 정보를 변형할 수 있습니다.
diamonds %>% ggplot(aes(x = carat, y = price)) + geom_point(aes(color = cut)) + geom_smooth(aes(color = cut), method = 'lm') + coord_cartesian(xlim = c(0, 3), ylim = c(0, 20000))
coord_cartesian() 함수를 통해 x축과 y축 범위를 지정해 줄 수 있습니다. xlim과 ylim 내부에 범위의 최소 및 최댓값을 지정해주면, 해당 범위의 데이터만을 보여줍니다.
diamonds %>% ggplot(aes(x = carat, y = price)) + geom_boxplot(aes(group = cut)) + coord_flip()
coord_flip() 함수는 x축과 y축을 뒤집어 표현합니다. ggplot() 함수의 aes 내부에서 x축은 carat을, y축은 price를 지정해 주었지만, coord_flip() 함수를 통해 x축과 y축이 서로 바뀌었습니다.
5. Theme
Theme은 그림의 제목, 축 제목, 축 단위, 범례, 디자인 등 그림을 꾸며주는 역할을 담당합니다.
diamonds %>% ggplot(aes(x = carat, y = price)) + geom_point(aes(color = cut)) + theme_bw() + labs(title = 'Relation between Carat & Price', x = 'Carat', y = 'Price') + theme( legend.position = 'bottom' ) + theme(panel.grid.major.x = element_blank(), panel.grid.minor.x = element_blank(), panel.grid.major.y = element_blank(), panel.grid.minor.y = element_blank() ) + scale_y_continuous( labels = function(x) { paste0('$', format(x, big.mark = ',', scientific = FALSE)) })
- theme_bw() 함수를 통해 배경을 흰색으로 설정합니다.
- theme() 함수 내 legend.position을 통해 범례를 하단으로 이동합니다.
- theme() 함수 내 panel.grid를 통해 격자를 제거합니다.
- scale_y_continuous() 함수를 통해 y축에서 천원 단위로 콤마(,)를 붙여주며, 이를 달러($) 표시와 합쳐줍니다.
ggplot2 패키지의 다양한 예제와 함수는 아래 링크를 참조하시길 바랍니다.
- http://r-statistics.co/ggplot2-Tutorial-With-R.html
- https://ggplot2.tidyverse.org/reference/
좋은 정보 감사합니다!
답글삭제