R 그래프 범위 지정하기 - lims, xlim, ylim 사용법

R을 이용해서 그래프를 그리다보면, 그래프의 x축 혹은 y축의 범위를 지정하여 확대/축소 하고 싶어질때가 있다. 이때, xlim, ylim 함수를 사용하면 된다. 각각 정의하기도 귀찮다면 lims로 한번에 x/y축 범위를 지정할 수도 있다. 그 방법을 한번 알아보자.

데이터 만들기

복잡한 그래프를 그릴게 아니라서, 간단하게 만들어봤다.

tb1 = tibble(x = c(1,3), 
             y = c(4, 7.7))

# A tibble: 2 × 2
      x     y
  <dbl> <dbl>
1     1   4  
2     3   7.7

그래프 그리기

geom_col 함수로 막대그래프를 그린다. 별다른 범위를 지정하지 않았기 때문에, x축이나 y축에 꽉찬 그래프가 자동으로 그려진다.

ggplot(tb1, aes(x,y)) +
  geom_col()

xlim, ylim 함수를 사용해서 x축은 -5 ~ 9까지의 범위를 지정하고, y축은 0 ~ 13으로 그래프축의 범위를 지정해본다. lims 을 사용하면 x/y축을 동시에 지정할 수 있다. 아래 2개의 소스는 동일한 결과를 나타낸다. 이렇게 지정하고 나니 여백이 자연스럽게 생기게된다.

# case1
ggplot(tb1, aes(x,y)) +
  geom_col() +
  xlim(-5, 9) +
  ylim(0, 13) +
  theme(axis.title = element_blank())

# case2
ggplot(tb1, aes(x,y)) +
  geom_col() +
  lims(x = c(-5, 9), y = c(0, 13)) +
  theme(axis.title = element_blank())

x축의 breakslabels 을 지정해서 그래프의 x축 정보를 바꾸려고 하면, 아래와 같은 에러가 발생한다.

# 잘못된 소스예시
ggplot(tb1, aes(x,y)) +
  geom_col() +
  scale_x_continuous(breaks = c(1,3), 
                     labels = c("A", "B")) +
  xlim(-5, 9) +
  ylim(0, 13)
[에러메시지]
Scale for 'x' is already present. Adding another scale for 'x', which will replace the existing scale.

이 뜻은 x축에 대해 범위지정을 이미 했는데, 중복으로 한번더 지정을 하다보니 나오는 메시지이다. 이상하다 나는 한번만 정의를 했는데, 어디서 2번했다는 건지 찾기가 어려웠다. 나중에 찾아보니, 지금 위의 소스에서는 x축 범위지정할 수 있는 함수 xlimscale_x_continuous 2개를 사용해서 발생한 에러메시지였다. scale_x_continuous 함수정보에 보면, limits 파라메터를 정의할 수 있는데, 이게 xlim과 동일한 효과를 내는 기능이다.

그래서 아래와 같이 수정되어야 한다.

# 수정후
ggplot(tb1, aes(x,y)) +
  geom_col() +
  scale_x_continuous(breaks = c(1,3), 
                     labels = c("A", "B"),
                     limits = c(-5, 9)) + # limits 정보추가.
  # xlim(-5, 9) + # xlim 은 주석으로 삭제처리.
  ylim(0, 13)

limits 파라메터를 (-5,9)-->(-2,6)으로 변경해보자. 그래프가 확대된 듯이 꽉차보이는 것을 알 수 있다. 효과적인 그래프 표현을 위해서 영역지정에 능숙해질 필요가 있으니 한번 해보시길 바란다.

ggplot(tb1, aes(x,y)) +
  geom_col() +
  scale_x_continuous(breaks = c(1,3), 
                     labels = c("A", "B"),
                     limits = c(-2, 6)) + # (-2, 6) 으로 변경.
  ylim(0, 13) 


더 보면 좋을 글들