聰明不如鈍筆
총명불여둔필
assignment KindeR

ggplot에서 원하는 글꼴 쓰기(feat. showtext)


R에서 ggplot2 패키지로 시각화 작업을 진행하다 보면 글꼴(폰트) 때문에 어려움을 겪을 때가 있습니다.


특히 한글을 쓰다 보면 R 콘솔에서는 분명 글씨가 멀쩡하게 보였는데 저장을 하고 나면 네모로 바뀌어 있는 일이 다반사.


이럴 때 구글링을 해보면 extrafont 패키지 사용법이 주로 나옵니다.


extrafont는 기본적으로 컴퓨터에 이미 설치한 글꼴을 가져다가 ggplot2 시각화 결과에 표시하는 기능을 합니다. 이 때문에 생기는 첫 번째 문제는 여러 컴퓨터를 오가면서 작업을 때는 글꼴 파일을 계속 옮겨줘야 한다는 것. 두 번째는 트루타입(.ttf) 글꼴만 활용할 수 있다는 점입니다.


이 문제를 해결할 수 있도록 세상에 나온 패키지가 바로 showtext입니다. 미국 퍼듀대 통계학과 박사 과정에 재학 중인 츄이쉬안(邱怡軒) 씨가 만든 이 패키지는 인터넷(기본적으로 '구글 폰트')에서 파일을 바로 내려받아 쓸 수 있도록 하고 있기 때문에 어떤 컴퓨터에서든지 원하는 결과물을 얻을 수 있습니다. 또 트루타입뿐 아니라 오픈타입(.otf) 글꼴은 물론 웹 오픈 폰트 형식(.woff) 글꼴 파일도 활용할 수 있습니다.


그러면 한 번 실제로 글꼴을 받아서 그래프를 그려보도록 하겠습니다. 먼저 그냥 예시로 쓸 수 있게 아무 그래프나 하나 그리겠습니다.

library('ggplot2')
ggplot(data=mtcars, aes(x=disp, y=mpg)) + geom_point()


R에 기본적으로 들어 있는 차종별 데이터(mtcars)에서 배기량(dist)과 연비(mpg)를 뽑아 그린 이 상점도는 '최대한 친절하게 쓴 R로 그래프 그리기(feat. ggplot2)' 포스트를 쓸 때 예시로 활용했던 녀석. 빈 칸에 글씨를 쓰기는 심심해서 다시 소환했을 뿐 별다른 의미는 없습니다.


이 그래프에 글씨를 써보도록 하겠습니다. 코드를 계속 반복하면 너무 길 테니까 먼저 이 그래프를 p라는 함수에 넣겠습니다.


ggplot2에서 그래프 위에 글씨를 쓰는 방식에는 여러 가지가 있는데 이번에는 annotate() 함수를 쓰겠습니다. 아래 코드는 x=275, y=28 위치에 크기 15로 "연습입니다"라는 글씨를 써달라는 뜻입니다. 

p <- ggplot(data=mtcars, aes(x=disp, y=mpg)) + geom_point()
p + annotate(geom='text', x=275, y=28, size=15, label='연습입니다')



이제 showtext 패키지로 글꼴을 바꿔보도록 하겠습니다. 아직 이 패키지를 설치하시지 않은 분이 대부분일 테니 설치부터.

install.packages('showtext')
library('showtext')
## Loading required package: sysfonts
## Loading required package: showtextdb


이렇게 패키지만 불러왔다고 곧바로 원하는 글꼴을 쓸 수 있는 건 아닙니다. 심지어 아직 어떤 글꼴을 쓰고 싶은지 알려주지도 않은 상황.


먼저 구글 폰트 활용법부터 알아보고 가겠습니다. 구글 폰트에 올라온 글꼴 중에 하나를 내려받아 쓰고 싶을 때는 font_add_google() 함수를 씁니다. 이 블로그에서 쓰고 있는 'Noto Sans KR'를 불러오는 코드는 이렇게 쓰면 됩니다

font_add_google('Noto Sans KR', 'notosanskr')


앞에 나오는 'Noto Sans KR'는 이 글꼴을 가져오라는 뜻이고, 뒤에 쓴 'notosanskr'는 앞으로 이 글꼴을 이 이름으로 부르겠다는 뜻입니다.


그렇다면 'Nanum Pen Script'(나눔손글씨 펜체)를 가져와서 'nanumpen'이라고 부르고 싶을 때는 어떻게 쓸까요? 네, 어려울 게 없습니다.

font_add_google('Nanum Pen Script', 'nanumpen')


이렇게 폰트를 불러오신 다음에는 showtext 글꼴을 자동으로 활용해 작업하겠다고 알려주는 코드를 한 줄 더 쓰셔야 합니다. 이렇게 말입니다.

showtext_auto()


글꼴 모양이 확실히 다르게 보이도록 나눔손글씨 펜체로 '연습입니다'를 바꿔볼까요? 아까랑 똑같이 쓰되 "family='nanumpen'"만 추가하면 됩니다.

p + annotate(geom='text', x=275, y=28, size=15, family='nanumpen', label='연습입니다')


예상대로 잘 바뀌었습니다. 이제 구글 폰트에 있는 글꼴이라면 얼마든 가져가 활용하실 수 있게 됐습니다.


RStudio로 작업을 하셨다면 이렇게 해도 글꼴이 바뀌지 않는 경우가 있을 수 있습니다. 이때는 코드 시작 부분에 {fig.showtext=TRUE}를 더하시면 됩니다. 그러니까 ```{r gif.showtext} 코드 ``` 형태입니다.  


그럼 이 사이트에 없는 글꼴은 어떻게 할까요? 그럴 때 쓰라고 showtext 패키지는 font_add()라는 함수도 준비하고 있습니다. font_add()는 font_add('앞으로 부를 이름', '파일 위치') 형태로 씁니다.


이번에는 연습 삼아서 '잉크립퀴드체'를 내려받아 써보도록 하겠습니다. 이 글꼴은 이 링크에서 무료로 다운로드하실 수 있습니다.


아, R에서 파일 위치를 지정하는 데 익숙한 분도 많겠지만 아닌 분도 적지 않을 겁니다. 이럴 때는 file.choose() 함수를 쓰면 다운로드 위치를 지정하듯이 파일 선택창에서 위치를 지정할 수 있습니다. 'ink'라는 이름으로 글꼴을 불러오겠습니다.

font_add('ink', file.choose())


이제 실제로 그래프에 적용할 차례. 앞선 코드에 "family='nanumpen'"을 "family='ink'"라고 바꾸기만 하면 됩니다.

p + annotate(geom='text', x=275, y=28, size=15, family='ink', label='연습입니다')


역시나 잘 나왔습니다. 이제 폰트 파일만 가지고 계시다면 어떤 글꼴이든 ggplot2 그래프에 쓸 수 있게 됐습니다.


혹시나 하고 말씀드리면 글꼴을 섞어쓰는 것도 당연히 가능합니다. 한번 해볼까요?

p + 
  annotate(geom='text', x=275, y=28, size=15, family='ink', label='연습입니다') +
  annotate(geom='text', x=275, y=25, size=15, family='notosanskr', label='연습입니다')


그럼 모두들 원하시는 폰트로 시각화 작업을 잘 마무리하시길 바라며 글을 마칩니다. 혹시 잘 이해가 가지 않으시거나 잘못된 내용이 있다면 언제든 알려주시면 대단히 감사하겠습니다.


댓글,

KindeR | 카테고리 다른 글 더 보기