ggplot2 #2. 추가 요소들
기본 문법 이후 추가적으로 그래프를 수정하고 꾸밀 수 있는 요소들에 대해 알아보자.
- ★Scale★
- Axes
- Legends
- Colors
- Grouping, Facetting
- Themes
Scales
R의 scale 함수는 특별한 기능을 가지고 있다.
이와 같은 형태를 띠게 된다.
Axes
데이터를 시각화하고 나서, 가장 기본적으로 생각할 수 있는 것이 그래프의 범위, 즉 축의 범위이다.
혹은 하나의 축을 로그스케일로 바꿀 수도 있으며, 눈금을 조절할 수도 있어야겠다.
xlab, ylab
축의 제목을 변경한다.
xlim, ylim
가장 기본적인 인자로서, 축의 범위를 직접 지정한다.
ggplot(economics) +
aes(psavert, pce) +
geom_step() +
xlim(5, 10) + ylim(2500, 10000)
expand_limits
꼭 확인하고 싶은 좌표가 있을 때 사용한다.
ggplot(economics) +
aes(psavert, pce) +
geom_step() +
expand_limits(x=20, y=20000)
Scale을 이용한 축 변경
위에서 정리한 scale을 이용하여 축을 수정해 보자.
ggplot(economics) +
aes(psavert, pce) +
geom_step()+
scale_x_continuous(
breaks = c(2, 3, 4, 5),
trans = "log10",
labels = c('이', '삼', '사', '오'))
축끼리 변경
coord_flip()을 사용한다.
특히 막대그래프의 경우 명목변수 명이 길 때 유용하다.
ggplot(mpg) +
geom_bar(aes(class)) +
coord_flip()
Legends
범례의 경우 theme 함수의 legend.position parameter로 위치를 조정할 수 있고
legend.direction 옵션으로 범례의 방향을,
범례의 제목을 full name으로 수정할 수 있다.
ggplot(mpg) +
geom_bar(aes(class, fill=manufacturer)) +
coord_flip() +
theme(legend.position = "bottom",
legend.direction = "horizontal") +
labs(fill="제조사")
Colors
scale 함수를 사용한다.
ggplot(mpg) +
geom_bar(aes(class, fill=drv)) +
coord_flip() +
scale_fill_manual(values = c('red', 'blue', 'green'))
또는 특정 palette를 사용할 수도 있다.
rainbow(7)은 무지개를 7종류 색으로 나누어 앞의 3가지를 사용하는 의미이다.
ggplot(mpg) +
geom_bar(aes(class, fill=drv)) +
coord_flip() +
scale_fill_manual(values = rainbow(7))
무지개색 시작을 빨간색 이외의 색으로 하려면,
rainbow(10, start = 0.3)과 같이 수정해주면 된다.
이런 Palette에는
- rainbow
- hcl.colors
- heat.colors
- terrain.colors
- cm.colors
등이 있으며,
ggplot(mpg) +
aes(cty, displ, color=cty) +
geom_point(size = 3)
자동으로 선택되는 색을 변경하고 싶은 경우,
p <- ggplot(mpg) +
aes(cty, displ, color=cty) +
geom_point(size = 3)
p + scale_color_gradientn(colors = c('white', 'blue'))
scale_color_gradientn 함수를 사용할 수 있다.
여기에는 여러 색을 사용할 수도 있으며
p + scale_color_gradientn(colors = c('white', 'blue', 'red'))
palette를 사용할 수도 있다.
p + scale_color_gradientn(colors = cm.colors(10))
결론적으로 다양한 옵션이 있지만,
scale_fill이나 scale_color을 사용하며,
연속변수인 경우 gradientn
이산변수인 경우 manaul을 사용하면 된다.
Grouping, Facetting
ToothGrowth dataset을 이용한다.
이는 기니피그에게 오렌지주스(OJ), 비타민C(VC)를 각각 특정 dose(0.5, 1, 2)로 주었을 때 치아의 성장을 기록한 dataset이다.
두 종류의 strata - (supplement 2개, dose 3개) - 로 총 6개의 subgroup이 있기 때문에 dose 별 효과를 볼 수도 있고, supplement 별 효과를 볼 수도 있다.
dose에 대한 length의 관계를 살펴보자
ggplot(t) +
aes(dose, len) +
geom_point()
여기서 두 가지 문제는
- 실질적으로 dose는 discrete variable이기 때문에 동일 간격으로 보여주면 좋겠다.
- 저 점들의 분포를 일목요연하게 보기 위하여 boxplot으로 보면 좋겠다.
boxplot으로 만들어보면,
ggplot(t) +
aes(dose, len) +
geom_boxplot()
이렇게 뭉뚱그려지기 때문에, grouping이 필요하다.
ggplot(t) +
aes(dose, len, group=dose, fill=dose) +
geom_boxplot()
현재 dose를 continuous variable로 인식하기 때문에 색도 같은 계열의 색을 사용하고 있고,
간격도 등간격이 아니다.
여기서 dose를 이산변수(factor)로 변환해 주면,
t$dose <- as.factor(t$dose)
이렇게 확인할 수 있다.
하지만, supplement 별 차이를 알 수 없다는 단점이 있다.
여기서 facet의 위력이 나타난다.
facet_grid( 행 ~ 열 ) 순서로 활용한다.
+ facet_grid(supp ~ .)
or
+ facet_grid(. ~ supp)
위와 같이 supl 명으로 facetting이 되어 데이터가 보기 좋게 나눠진 것을 알 수 있다.
이때 중요한 것은 aes에서 supp 변수를 가져오지 않았음에도,
facetting에 supp을 사용함으로써 데이터를 처리했다는 것이다.
우리가 가진 6개의 strata를 모두 facetting 해볼까?
ggplot(t) +
aes(dose, len, group=dose, fill=dose) +
geom_boxplot() +
facet_grid(supp ~ dose)
dose가 여전히 x축에 나눠져 있어서 보기에 좋지 않다.
facetting에 dose를 사용했으므로 aes에서 빼고, legend도 굳이 필요가 없어지므로 제거해 보자.
ggplot(t) +
aes(y=len, group=dose, fill=dose) +
geom_boxplot() +
facet_grid(supp ~ dose) +
xlim(-1, 1) +
theme(legend.title = element_blank(),
legend.position = 'none',
axis.title.x = element_blank(),
axis.text.x = element_blank())
깔끔한 strata 별 boxplot을 얻었다.
'Career > R' 카테고리의 다른 글
ggplot2 #4. practice - moonBook::acs (0) | 2023.01.03 |
---|---|
ggplot2 #3. Useful libraries - GGally, ggpubr, gganimate, esquisse, color packages (0) | 2023.01.02 |
ggplot2 #1. 기본 문법 (0) | 2022.12.31 |
R #2. plot 함수, 기타 그래픽 함수 (0) | 2022.12.30 |
R #1. 기본 문법과 자료형 (0) | 2022.12.02 |