연재의 공식적인 마지막 주제를 올린다.
거의 실무에서는 쓰이지 않지만 미려한 그래프를 만들기 위한 방점을 찍을 수 있는 툴에 대한 간략한 소개글이니 부담없이 따라하시면 될 듯 하다.
<연재주제> R 기반의 데이터 시각화
<필자> 전희원 | 넥스알에서 데이터 사이언티스트로 일하고 있다.
잉크스케이프를 활용한 그래프 후처리
<연재순서>
2회: R 프로그래밍 맛보기
3회: R로 데이터 다루기
5회: 잉크스케이프를 활용한 그래프 후처리
프로그래머에 가까운 필자가 그래픽 후처리 프로그램을 사용한다는 게 이상하기도 하다. 물론 필자 역시 1년 전만 해도 이런 원고를 쓸 줄은 예상도 하지 못했다. 하지만 이번 글은 R 기반의 데이터 시각화라는 전체 주제를 마무리 짓기 위한 것으로서, 독자들에게 이런 마지막 과정도 있다는 것을 알리는 것 만으로도 의미가 있다고 생각한다.
지난 호 글에서 제공한 ggplot2에 대한 옵션을 더 발전시키면 이미지 출력에 대한 더 세밀한 컨트롤이 가능하긴 하지만, 많은 데이터 시각화 업무를 하는 분들은 대략의 작업을 엑셀, R에서 한 다음에 매끈하게 다듬는 일을 어도비 일러스트레이터에서 한다. 사실 일러스트레이터를 이용해 처음부터 끝까지 그래프 작업을 할 수 있다. 하지만 굉장히 많은 수작업이 들어가기 때문에 단순 작업의 연속이 되며, 그에 따라 실수도 많아진다. 그래서 필자는 주로 R의 ggplot2로 기본적인 그래프 출력을 한 뒤 폰트 및 텍스트 작업을 추가적으로 수행한다. 물론 필자는 비싼 어도비일러스트레이터를 사용하기 보다는 무료인 잉크스케이프(Inkscape)를 사용하지만 말이다.
이번 글은 지난호처럼 20페이지가 넘을 정도로 길지 않다. 이번 글에서는 딱 필자가 사용하는 수준의 그래프 작업만을 소개하겠다. 잉크스케이프도 역시 처음 사용하는 사람에게는 만만한 그래픽 툴이 아닌지라 이 툴에 대한 자세한 내용은 관련 소개서를 참고하기 바란다.
환경 설정하기
리눅스, OS X, 윈도우. 이 대표적인 세 가지 운영체제에서 R이 주로 사용된다. 그 중에서 cran.nexr.com 사용자 통계결과로 보면 윈도우 유저가 90% 이상을 차지한다. 이번 글은 윈도우를 주요 플랫폼으로 사용하겠다. 이는 R에서 벡터 그래픽을 출력하기 위한 명령어인 pdf의 폰트 설정이 서로 다르기 때문이다. 폰트는 ’맑은고딕’을 사용한다. 이 폰트는 윈도우 운영체제에 기본 탑재됐고, 이 폰트가 없는 윈도우 7 이전의 OS 사용자는 직접 설치하기 바란다.
사실 윈도우에서든 맥에서든 리눅스에서든 한글이 포함된 pdf를 출력한다는 건 쉬운 문제가 아니다. 그나마 R에서는 2.15 이후 cairo(http://www.cairographics.org/)가 기본 탑재돼 정말 쉬워졌다.
이어서 잉크스케이프 윈도우 버전을 http://inkscape.org/download/?lang=en에서 내려 받아 설치한다. 윈도우 Installer 버전으로 설치하면 편하며, 설치에 그다지 어려운 점은 없을 것이다.
예제 그래프 만들기
일단 예제로 쓸 그래프는 이 주제의 세 번째 연재인 ‘Data Munging With R’의 마지막에 제안했던 그래프를 사용하도록 하겠다. 이 그래프는 사실 독자들에게 출력물만 제공했으며, 코드는 제공하지 않았다. 이는 독자들에게 생각해볼 시간을 부여하기 위해서였다. 이제 다음과 같이 코드를 공개한다.
library(plyr) library(ggplot2) load(url("http://dl.dropbox.com/u/8686172/market_price.RData")) res <- ddply(market_price, .(M_TYPE_NAME, A_NAME), summarise, avg=mean(A_PRICE)) res.plot<- ggplot(res, aes(A_NAME, M_TYPE_NAME)) + geom_tile(aes(fill=avg)) + theme(axis.text.x= element_text(angle=90, hjust=1)) + scale_fill_gradient(low="green", high="red") res.plot |
위 코드를 실행하면 <그림 1> 그래프가 출력될 것이다. 이때 만일 그래프 출력에 에러가 발생한다면, ggplot2를 새로운 버전으로 업데이트하기 바란다.
그림 1
기본 R에서 앞 코드를 실행하면, <그림 1> 그래프가 새창으로 뜰 것이다. RStudio에서 실행하면 오른쪽 빈 공간에 그래프가 출력될 것이다. 기본 R에서는 [파일 → 다른 이름으로 저장]을 통해 다양한 포맷으로 그래프를 저장할 수 있다.
우리가 필요로 한 포맷은 일러스트레이터나 잉크스케이프에서 쓰일 벡터 기반의 그래프로, R에서는 pdf 출력을 통해 이 파일을 얻을 수 있다(물론 SVG 포맷도 가능하지만 이 역시 한글 문제가 있다). 아쉽게도 우리가 필요로 한 pdf로 출력을 하면 <그림 2>와 같이 출력될 것이다. 그 이유는 한글을 표현할 인코딩 문제 때문으로, 이것을 피하기 위해 cairo를 사용하는 것이다.
그림 2
또 한 가지 문제는 폰트 처리로서 cairo_pdf의 기본 폰트는 한글을 표현할 수 없다. 따라서 폰트 지정을 하지 않고 출력하면 <그림 3>과 같이 폰트가 깨진 그래프가 출력된다.
그림 3
따라서 아래와 같은 명령어를 사용해 R이 이해할 수 있도록 폰트를 등록하자. 기본 windowsFonts() 명령어를 사용하면 현재 R 시스템에 등록된 폰트 매핑 테이블이 출력된다.
>windowsFonts() $serif [1] "TT Times New Roman" $sans [1] "TT Arial" $mono [1] "TT Courier New" >windowsFonts(malgun=windowsFont("맑은 고딕")) >windowsFonts() $serif [1] "TT Times New Roman" $sans [1] "TT Arial" $mono [1] "TT Courier New" $malgun [1] "맑은 고딕" |
windowsFonts(malgun=windowsFont("맑은 고딕")) cairo_pdf(family="malgun",width=10,height=5) res.plot dev.off() |
이렇게 하면 getwd() 명령어로 출력되는 디렉터리에 ’Rplotxxx.pdf’라는 이름으로 파일 하나가 생성된 것을 볼 수 있다. 우리가 의도한 그래프가 pdf로 만들어진 것이다. 이제 우리가 필요로 하는 pdf 파일은 완성됐다.
잉크스케이프로 그래프 후처리하기
일단 잉크스케이프를 실행한 후 [File → Open] 메뉴를 클릭해 만들어 놓은 pdf 파일을 읽어 들인다. 처음 읽어 들이는 데 시간이 걸리므로 참을성 있게 기다려보자. 드디어 <그림 4>와 같은 잉크스케이프 화면을 볼 수 있다.
그림 4
잉크스케이프에서 [F1] 키를 눌러 selection tool을 활성화 한 후, 그래프의 각 요소를 클릭해 보면 선택 외곽선이 표시된다. 일단 x, y축의 이름을 한글로 바꾸고, avg라는 범례 제목도 한글로 바꾸자.
그래프의 각 부분을 클릭하면, 우리가 선택하고자 하는 텍스트의 개별 선택이 불가능하다. 개별 선택을 할 수 있도록 {Object → Ungroup}으로 그룹해제를 한다. 그렇게 하면 각 축의 이름과 범례 제목이 분리되는 것을 볼 수 있다. 분리된 각 텍스트 중에서 x축의 텍스트를 선택하고 이를 교체해 보자. 일단 텍스트를 선택하고 {Text → Text and Font}를 선택하면 <그림 5>와 같은 폰트와 텍스트 편집 창이 뜬다.
그림 5
적절한 폰트와 텍스트를 입력하고 ‘Apply’ 버튼을 눌러 적용한다. 이렇게 우리가 편집하고자 한 세 가지 항목에 대해 편집을 하자(필자는 ‘다음체’를 폰트로 사용했으며 이것도 역시 인터넷에서 무료로 내려받을 수 있다).
x축의 데이터 텍스트들도 너무 커서 서로 침범하고 있으므로 이것들도 조절하자. x축 데이터 텍스트들의 폰트 크기를 조절하면 그래프와 정렬이 흐트러지므로 커서로 적절하게 객체들을 옮겨서 열을 맞추면 된다.
그림 6
대략적으로 이 과정을 거쳐 진행됐다. 하지만 왠지 ggplot2의 갈색 배경 테마가 어색하다. 각 그리드(grid)의 상자를 하얀색으로 구분하면 좀더 깔끔해 보일 것 같다.
이를 위해 범례 및 레이블을 제외한 그래프 본체를 선택하자. 왼쪽 도구 상자에서 [Pick colors from images] 툴을 선택하면 스포이드가 올라온다. 이 툴은 특정 주변색으로 객체의 배경과 테두리의 색상을 바꾸기 위한 것이다. 객체와 이 툴을 선택한 후 [shift] 키를 누르고 마우스 왼쪽 버튼을 클릭해 테두리 색상으로 쓰일 색깔을 선택해주면 <그림 7>과 같이 테두리 색상이 바뀐다. 색 선택은 자유이나 바탕에 있는 하얀색으로 클릭해주면 훨씬 낫다.
그림 7
<그림 7>과 같이 훨씬 깔끔하게 플로팅된 것을 확인할 수 있다. 배경색도 흰색에 가까운 색으로 바꾸자. 이 역시 테두리 색을 바꾸는 과정과 동일하다. 다만 회색으로 바꾸기 위해서는 ‘채움(fill)’ 명령으로 해야 된다. 채움 명령은 단순히 [Pick color from image] 툴을 선택하고 채우고 싶은 색상 위에서 왼쪽 마우스 클릭만으로 가능하다. 하지만 단순히 이런 과정을 통해 색상을 바꾼다면 모두 하얀색으로 바뀔 것이다. 원하는 모습으로 바꾸자면 내부 그래프 객체에 대해 그룹을 해제해야 된다. 이 이유는 그룹 자체가 각 그래프 객체의 오브젝트들의 레이어를 이루고 있기 때문으로, 그룹을 해제한 후 배경 레이어만 선택해 색상을 적용하기 위함이다. 모두 그룹 해제를 한 후에 앞의 과정으로 진행하면 회색 배경이 하얀색 배경으로 바뀐 것을 알 수 있다.
그림 8
마지막으로 x축의 눈금자와 텍스트가 멀리 떨어져 부자연스러워 보인다. 이들 객체를 선택툴로 모조리 선택해 위로 이동해 주자! 마지막으로 [Create and edit text object] 툴을 선택해 적당한 곳에 <그림 9>와 같이 제목을 넣어주자.
그림 9
그래프 후처리와 나머지 작업
잉크스케이프의 장점은 역시 위지위그(WYSIWYG)와 무료라는 데 있다. 물론 고가의 일러스트레이터의 모든 기능을 망라하지는 못하지만, 필자와 같이 급하게 파워포인트에 쓰일 그래프를 만드는데 사용할 수 있는 수준의 유용한 툴이다.
하지만 필자는 그래프조차도 재사용성(reproducible)이 가능해야 된다고 생각하는 사람 중 한 명이다. 다른 누군가 어떤 환경에서 코드를 실행해도 같은 그래프가 나오도록 하는 건 그만큼 가치 있고 소중한 작업이기 때문이다. 특히 리서치 분야에서는 후학을 위해 꼭 그렇게 할 필요가 있다.
이를 위해서는 코드로 가능한 한 많은 부분을 커버해야 된다. 따라서 잉크스케이프 사용은 일회성의 작업 혹은 반드시 필요한 곳에 사용하는 유연성을 가져야 된다는 것을 명심했으면 한다.
이로써 ‘R 기반의 데이터 시각화’ 연재를 마친다. 그 동안 이번 연재에 관심을 갖고 읽어주신 독자 여러분께 감사드린다. ‘R 기반의 데이터 시각화’라는 주제는 R에서는 가장 큰 주제 중에 하나이다. 이를 몇 번의 연재로 커버하는 것은 쉽지 않지만, 그 시작점으로 부족하지는 않을 거란 생각을 해본다. 이 연재를 진행하면서 말하고 싶었던 가장 큰 주제는 그래프를 플로팅 한다는 거 자체가 목적이 되서는 안되며, 상대방에게 정보를 전달하기 위한 첫 번째 목적과 더불어 본인이 데이터를 이해하는 과정으로서의 두 번째 목적을 만족시켜야 한다는 것이다. 데이터를 어떻게 표현하느냐 고민하는 것 자체가 분석의 과정에서 중요한 포인트가 되며 새로운 분석 아이디어의 촉매가 될 수 있다는 것을 항상 명심했으면 한다.
[DBGUIDE 연재] 잉크스케이프를 활용한 그래프 후처리 by from __future__ import dream is licensed under a Creative Commons Attribution-NonCommercial 4.0 International License.