ggplot2 #2. 추가 요소들

Career/R|2023. 1. 1. 09:40

기본 문법 이후 추가적으로 그래프를 수정하고 꾸밀 수 있는 요소들에 대해 알아보자. 

 

  • ★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()

여기서 두 가지 문제는

  1. 실질적으로 dose는 discrete variable이기 때문에 동일 간격으로 보여주면 좋겠다. 
  2. 저 점들의 분포를 일목요연하게 보기 위하여 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을 얻었다. 

댓글()