Google AdSense (text)

hidden logo stop

Moving

거지 같은 이글루스 광고노출 정책이 싫어서,
새 보금자리(http://blog.leocat.kr/)로 이사감.

[R/ggplot2] 그래프 축(영역) 자르기 Computer & Program

R로 그래프를 그리다 보니 한쪽으로 치우쳐진 그래프가 종종 그려진다. 나머지 부분은 필요 없기 때문에 잘라내고 싶은데, 이게 말처럼 쉽지가 않다. ggplot2는 doc 문서가 잘 되어 있는데도 모든 함수들을 알고 있지 않으면 타이핑하기 힘들어서 쓸 수 없는게 단점인듯 싶다. 물론 R의 모든 패키지가 타이핑해야해서 힘들긴 하지만, 자동완성이나 찾아보기 같은게 좀 더 잘 되어 있으면 좋겠다. 특히 그래픽 라이브러리는 GUI를 통해서 직접 컨트롤 할 수 있으면 더 좋지 않을까 싶다.

아래 스냅샷을 보면 왼쪽이 원본 데이터이다. 너무 아래에 있어서 세로 y축을 0~1000 사이로 잘랐더니 그래프가 변형이 됐다. 특히 가장 왼쪽과 오른쪽 끝에 있는 녀석들이 심하게 변형됐다. 오른쪽에 있는 녀석은 원래 1000을 넘는 boxplot이었는데, 잘라내니 750으로 줄었다. 아무래도 잘라내는게 그래프를 자르는게 아니라 원본 데이터를 잘라버리는듯 싶어서 열심히 구글링..



어떻게 잘라야 그래프를 그리는 데이터가 잘리지 않고 그래프만 자를 수 있을까?? 우선 다음은 예제를 위한 샘플 데이터이다.

$ R
> x <- data.frame(year=c(2000, 2002, 2003, 2004, 2007, 2008, 2009), val=c(4, 11, 5, 5, 5, 4, 6))
> x
  year val
1 2000   4
2 2002  11
3 2003   5
4 2004   5
5 2007   5
6 2008   4
7 2009   6
> p <- ggplot(x, aes(x=year, y=val))
> p + geom_boxplot()

그리고 이 데이터를 boxplot으로 그려봤다. 너무 위쪽에 혼자 따로 있는 데이터 때문에 나머지 그래프가 작게 보이는 것이 싫어서 위쪽을 자르고 싶다.



몇 가지 ggplot layer를 추가하면서 테스트해보자.

1. scale_x_continuous(..., expand = waiver())
> p + geom_boxplot() + scale_y_continuous(limits = c(4, 6))
Warning message:
Removed 1 rows containing non-finite values (stat_boxplot).


scale에 limit를 걸어버리면 그래프를 그리는 데이터자체가 필터링되어 잘린다. 원본 데이터의 서브셋으로 그래프를 그리게 되는 것이다. 위와 같이 자르면 y축이 4 ~ 6 사이인 데이터만을 가지고 그래프를 그리게 되고, 11은 사라지게 된다. 때문에 boxplot의 사분위값 중 Q3가 6에서 5로 변경된다.


2. coord_cartesian(xlim = NULL, ylim = NULL, wise = NULL)
> p + geom_boxplot() + coord_cartesian(ylim = c(4, 6))


이렇게 자르면 전체 데이터로 그래프를 그린 다음, 원하는 영역을 잘라 확대해서 보여주게 된다. 필요한 부분만 zoom하는 역할을 한다. 그래프를 그려주는 데이터셋의 변화가 없기 때문에 그래프가 변형되지 않는다.


내가 원하는 것은 그래프의 일부를 잘라서 확대해 보는 것이니 coord_cartesian()을 사용하면 되겠다. 그리고 이왕 축 관련 함수를 찾아봤으니, 축 관련 함수 몇 개..

1. coord_fixed(ratio = 1, xlim = NULL, ylim = NULL, wise = NULL)
그래프의 x축과 y축의 비율을 조절한다. ggplot으로 그래프를 그리게 되면, 데이터의 형태에 따라 자동으로 최대/최소를 찾아서 그려주게 된다. 하지만 가끔은 x축과 y축의 비율이 중요할 때가 있다.
> x <- data.frame(x=c(1, 10, 13, 8, 4), y=c(1, 2, 3, 4, 3))
> ggplot(x, aes(x=x, y=y)) + geom_line()
> ggplot(x, aes(x=x, y=y)) + geom_line() + coord_fixed(ratio=1)
> ggplot(x, aes(x=x, y=y)) + geom_line() + coord_fixed(ratio=10)




2. coord_flip(...)
그래프의 x축과 y축을 바꿔준다.
> x <- data.frame(x=c(1, 10, 13, 8, 4), y=c(1, 2, 3, 4, 3))
> ggplot(x, aes(x=x, y=y)) + geom_bar(stat='identity')
> ggplot(x, aes(x=x, y=y)) + geom_bar(stat='identity') + coord_flip()




3. coord_trans(xtrans = "identity", ytrans = "identity", limx = NULL, limy = NULL)
지수와 같이 축 비율을 변경할 수 있다.
> x <- data.frame(x=c(1, 10, 13, 8, 4), y=c(1, 2, 3, 4, 3))
> ggplot(x, aes(x=x, y=y)) + geom_line()
> ggplot(x, aes(x=x, y=y)) + geom_line() + coord_trans(x='log10', y='log10')



- 참조
How to set limits for axes in ggplot2 R plots?
R help - ggplot axis limit
ggplot2 documentation

덧글

댓글 입력 영역

Google AdSense (text/image)