본문 바로가기
기타/프로그램

[2024년 1월 17일] R - PDF 저장시 한글 깨짐 문제 해결(ggplot, ggsave)

by 두루별 2024. 1. 18.

내가 왜 R을 사용하고 있는지 모르겠지만, 이 R이란 녀석이 아주 드러운 녀석이다. 그동안의 개발 상식이 안 통함...
R과는 전혀 관련 없는 내가 R을 사용하다 보니 이런저런 난관이 있었는데, 그중에서도 제일 짜증 났던 게 차트 저장 시 한글이 깨지는 문제였다. 

좌측은 PNG 출력 우측은 PDF 출력

재밌는 건 특별히 처리를 하지 않아도 이미지로 저장하면 한글이 잘 나옴. 유독 PDF로 저장할 때만 한글이 사라지고 네모네모들만 남아 있는 요상한 문제였다. PDF 저장할 때 한글 변환을 제대로 못하는 거지...

온갖 몸에 좋다는 건 다 시도해 봤지만 결국 PDF 저장 시에는 폰트를 지정해도 한글은 제대로 출력되지 않고 온갖 오류만 잔뜩 나온다는 걸 알게 됐다. 하여간 양놈들의 MBCS 처리는 정말 짜증 남...

감기로 정신이 혼미해져 갈 즈음 Cairo를 사용해 보라는 어느 현자의 글을 보게 됨.

카이로?? 이름이 영 마음에 들지 않았지만 구글을 뒤져보니 고퀄리티 그래픽 라이브러리라고 한다. 뭐 딱히 방법이 없으니 사용해 보기로 하고 일단 패키지를 설치.

크게 코드를 수정할 부분은 없었고 패키지 로드하고 PDF로 저장하는 ggsave의 device를 'cairo_pdf'로 지정하면 끝.

# 필요한 라이브러리를 로드
...
library(Cairo)
...

# 기본 폰트 지정. (맥은 알아서...)
windowsFonts(malgun = windowsFont("맑은 고딕"))

# 중략

...

# Tree data 불러 오기
tree <- read.tree("tree_data_kr.txt") # 조류 162종

# 계통수 생성
tree_data <- ggtree(tree, layout = "circular", open.angle=10) + geom_tiplab(size=1.8, offset=0.1, family="malgun")

# 계통수 그리기
plot(tree_data)

# PDF 저장시 device를 cairo_pdf로 지정
ggsave(filename = "phylogeny.pdf", plot=tree_data, device = cairo_pdf, width = 15, height = 30 , units = "in" , limitsize = FALSE)

결과는? 깔끔하게 잘 출력됨. PDF로 한글 포함된 차트 저장할 땐 그냥 Cairo 사용해서 저장하면 된다.

만약 그래도 안된다면 Font family를 지정하지 않아서 그럴 거다. 나의 경우는 차트의 Tip label의 한글이 깨지는 문제여서 geom_tiplab() 함수에 family를 추가하면서 내가 지정한 기본 폰트인 '맑은 고딕'으로 설정했다. 이거 안 하면 네모네모로 나온다.

아무튼 그동안 탐조하면서 쌓인 데이터를 가지고 이런저런 짓을 해보다가 여기까지 왔는데, 계통수(Phylogenetic tree)를 그려보다가 어이없게도 한글이 깨지는 20세기에나 나올법한 오류를 보고는 깊은 빡침에 빠지게 되었지만 PDF 출력 라이브러리 교체로 간단히 해결됐다는 그런 훈훈한 얘기다... 감기엔 역시 판콜... 콜록...

아래는 최종 결과물. 162종의 조류 계통수다.

같은 데이터를 2차원 평면에 그려보면 아래처럼 보인다. 꿩과 흰꼬리딱새는 정말 멀구나...