(ggplot2) ggsave 사용시 폰트 문제 해결방법

ggplot 을 사용할 때, 컴퓨터에 설치되어 있는 폰트를 사용하여 텍스트를 표현할 수 있다. 그런데 특정 폰트를 사용하여 RStudio 에서 차트를 생성하면 plot 뷰어에서는 제대로 폰트가 잘 적용이 되다가, ggsave 로 export 를 하면 기본폰트처럼 돌아가 있는 현상이 있었다.

RStudio Plot 뷰어에서는 아래와 같이 특정폰트 설정한 결과가 잘나온다.

ggplot(sido_map_sim) +
  geom_sf() +
  theme_bw(base_family = '폰트명입력')

그런데 ggsave 로 막상 차트를 파일로 저장하면, 아래와 같이 전혀 다른 폰트가 나온다.

ggsave("./mypath/filename.png", 
       width = 8, height = 8, 
       dpi = 240, units = "in")

extrafont 설치

사전작업으로 컴퓨터에 설치되어 있는 폰트를 활용하기 위한 extrafont 설치가 필요하다.

install.packages("extrafont")

import 최초과정은 몇분걸린다. 특정폰트만 import 하고 싶으면 안에 파라메터를 설정하면 되지만, 한번만 하면 되는 과정이라 다 import 했다.

library(extrafont)
font_import()

Importing fonts may take a few minutes, 
depending on the number of fonts and the speed of the system.
Continue? [y/n] # y 입력

그리고 extrafont db에 저장된 폰트들을 load 하는 과정을 실행한다.

loadfonts()

ggsave device 설정

예전에는 여기까지 하면 이 폰트문제가 해결이 되었는데, 여전히 ggsave 함수를 이용해서 나오는 png 파일에 폰트가 적용이 안되었다. 최근에 ggplot2 를 재설치했기 때문에 내가 모르는 변화사항이 있는거 같아 버전을 우선 확인한다.

packageVersion('ggplot2')
[1] ‘3.4.4

ggplot2 Changelog를 확인하다가, 아래 부분을 확인하게 되었다. ggsave 3.3.4 업데이트 되면서, device 파라메터에 ragg 로 기본으로 셋팅되도록 변화가 있었다. 근데 어떤 이유인지는 아직 모르겠지만, 내 환경에서는 ragg 가 정상작동하지 않는 것 같았다.

ggplot2 3.3.4 - CRAN release: 2021-06-16

ggsave() now uses ragg to render raster output if ragg is available. 
It also handles custom devices that sets a default unit 
(e.g. ragg::agg_png) correctly (@thomasp85, #4388)

원래 device 로 바꿔야겠다는 생각을 했고, 아래와 같이 소스를 수정해서 실행하니 해결이 되었다.

ggsave("./mypath/filename.png",
       device = grDevices::png,  # device 설정 추가
       width = 8, height = 8, 
       dpi = 240, units = "in")

device 에 들어가는 패키지를 아래와 같이 풀어서 실행해도 동일한 파일을 얻을 수 있다. plotg1 이름으로 저장하는 과정까지 있어야 하니, 사실 이 방법은 잘 사용하지 않을 것 같다.

png(filename = "./mypath/filename.png",
    width = 8, height = 8, 
    res = 240, units = "in")
print(g1)
dev.off()

더 보면 좋을 글들