ggplot2 x/y축 위치 변경하기

ggplot2 에서 x축 혹은 y축 위치를 변경하는 방법을 정리해본다. 아래 그림은 최종결과물인데, 보듯이 x축이 위에 위치해 있는 것을 알 수 있다. 기본은 x축은 아래(bottom)에 위치하지만, 특정 옵션을 사용하면 위로(top) 이동시킬 수 있다.

그래프 데이터 만들기

이전 그래프에 보면 알듯이 x축은 날짜로 이루어져있고, y축은 단순한 숫자이다. x값을 date형으로 변경하기 위해서 as.Date 함수를 사용했다. y값은 마이너스 값으로만 되어있고, 아래로 뻗는 막대그래프를 표현하기 위한 수치이다.

library(tidyverse)
tb1 = tibble(x = c("20220401","20220501","20220601",
                   "20220701","20220801","20220901","20221001"),
             y = c(-24.77, -16.06, -24.97, 
                   -50.89, -93.94, -37.78, -66.96)) %>% 
  mutate(x = as.Date(x, "%Y%m%d"))

# A tibble: 7 × 2
  x              y
  <date>     <dbl>
1 2022-04-01 -24.8
2 2022-05-01 -16.1
3 2022-06-01 -25.0
4 2022-07-01 -50.9
5 2022-08-01 -93.9
6 2022-09-01 -37.8
7 2022-10-01 -67.0

그래프 x/y축 이동하기

geom_col 함수로 막대그래프를 그린다. 막대그래프 색상만 입력했고, theme_classic 으로 테마를 지정했다. theme_classic는 x/y 축이 가장 돋보이는 테마여서 사용했다. 이 테마를 사용해서 x/y 축이 변경되는 모습을 보여주려 한다. 우선 아무것도 설정하지 않으면, x축은 아래(bottom)이고, y축은 왼쪽(left)편에 있다.

ggplot(tb1, aes(x,y)) +
  geom_col(fill = "#3690c0") +
  theme_classic()

scale_x_date 함수내에 position = "top" 옵션을 설정하면, x축이 위로(top) 이동한다. 지금 x축값이 date형이어서 scale_x_date를 사용했지만, 일반적인 숫자라면, scale_x_continuous 함수를 사용하면 된다.

ggplot(tb1, aes(x,y)) +
  geom_col(fill = "#3690c0") +
  scale_x_date(position = "top") +
  theme_classic()

이번엔 y축을 오른편으로 옮겨본다. scale_y_continuous 함수에 position = "right" 옵션을 사용하면 된다.

ggplot(tb1, aes(x,y)) +
  geom_col(fill = "#3690c0") +
  scale_x_date(position = "top") +
  scale_y_continuous(position = "right") +
  theme_classic()

그래프에 텍스트 추가하기

이전 그래프를 보면 x축에 보면 매월 표시가 되지 않고, 듬성듬성 표시된걸 볼 수 있다. 이런경우 scale_x_date 를 이용하면 모든 막대그래프마다 x축 값을 표시할 수 있다. date_breaks 파라메터에 "2 weeks", "10 years" 와 같은 기준을 텍스트로 입력하면 해당 기간별로 x축에 레이블이 생성된다. 나는 매월별로 표시하고 싶었기 때문에 "1 months" 로 입력했다.

ggplot(tb1, aes(x,y)) +
  geom_col(fill = "#3690c0") +
  scale_x_date(position = "top", 
               date_breaks = "1 months",
               date_labels = "%b") +
  theme_classic()

geom_text을 사용해서 막대그래프에 각 막대그래프 끝에 수치가 표시되도록 한다. vjust 옵션으로 막대그래프와의 간격을 조정한다.

ggplot(tb1, aes(x,y)) +
  geom_col(fill = "#3690c0") +
  geom_text(aes(label = y), vjust = 1.7) +
  scale_y_continuous(expand = expansion(c(0.15,0.05))) +
  scale_x_date(position = "top", 
               date_breaks = "1 months",
               date_labels = "%b") +
  theme_classic()

최종적으로 정리한 막대그래프의 모습이다. 막대그래프마다 수치가 있으니 불필요한 y축은 없앴다.

ggplot(tb1, aes(x,y)) +
  geom_col(fill = "#3690c0") +
  geom_text(aes(label = y), vjust = 1.7) +
  scale_y_continuous(expand = expansion(c(0.15,0.0))) +
  scale_x_date(position = "top", 
               date_breaks = "1 months",
               date_labels = "%b") +
  theme_classic() +
  theme(axis.title = element_blank(),
        axis.line.y = element_blank(),
        axis.text.y = element_blank(),
        axis.ticks = element_blank())


더 보면 좋을 글들