Jupyter R kernel에서 ggplot 그래프에 일본어가 표시되지 않는 문제를 해결합니다.

19484 단어 ggplot2RJupyter

우분투의 경우



Jupyter notebook에서 다음 R 코드를 실행하면,
library(ggplot2)

d <- data.frame(x=c("ABC", "DEF", "GHI"), y=c(1, 2, 3))
ggplot(d, aes(x, weight=y)) +
  geom_bar(fill="gray50", color="gray10") + geom_text(aes(y=y, label=x)) +
  xlab("horizontal label") + ylab("vertical label") + ggtitle("Title")

d <- data.frame(x=c("あいうえお", "かきくけこ", "さしすせそ"), y=c(1, 2, 3)) 
ggplot(d, aes(x, weight=y)) +
  geom_bar(fill="gray50", color="gray10") + geom_text(aes(y=y, label=x)) +
  xlab("横軸") + ylab("縦軸") + ggtitle("タイトル")

자신의 우분투 18.04 환경에서는 다음 출력이 되었다. 일본어가 모두 비어 있습니다.





다양한 정보를 보았다. 다음 중 어느 것도 작동하지 않았다.
  • theme(text=element_text(family="font-name")) 에서 글꼴 지정
  • extrafonts 에서 글꼴 로딩
  • quartzFonts()로 글꼴 이름 등록

  • 에러도 경고도 없고, 단지 표시되지 않는 상태였다.
    그런데, ggsave 를 사용해 파일에 쓸 때 제대로 출력되고 있는 것 같았다. 그래서 근본적인 대처는 몰랐지만 그래프를 임시 파일에 내보내서 그것을 표시시키는 방식을 취했다.
    ggshow <- function(g=last_plot(), dispwidth=600, dispheight=NULL, tmpdir="ggtmp", ...) {
      # show ggplot graph
      # a quick workaround to the issue where
      # Japanese texts are not displayed on the notebook
      if (!dir.exists(tmpdir)) {
        if (file.exists(tmpdir)) {
          stop(sprintf("'%s' already exists as a file.", tmpdir))
        }
        dir.create(tmpdir, recursive=TRUE)
      }
    
      tmpfile <- file.path(tmpdir, "tmp.jpg")
      ggplot2::ggsave(tmpfile, g, ...)
      IRdisplay::display_jpeg(file=tmpfile, width=dispwidth, height=dispheight)
    }
    
    ggshow()
    


    ggshow 함수 정보
  • g 에 표시하고 싶은 ggplot 오브젝트를 지정.
  • dispwidth , dispheight 로 표시 사이즈를 지정. 한쪽만 지정하면 종횡비 고정으로 조정된다.
  • ...ggsave 로 전달되므로 width , height 등을 지정하여 크기를 조정할 수 있습니다.

  • 일단 목적은 달성할 수 있지만, 근본적으로 해결하는 방법이 있다면 꼭 가르쳐 주었으면 합니다.

    MacBook의 경우



    MacBook에서 같은 코드를 실행하면 대량의 경고가 나오고 이른바 '두부'가 나타났다. 폰트가 대응하고 있지 않는 것이 원인인 것 같다.
    대처법으로서는, 이 기사 을 참고로, 이하의 스텝을 취했다.
  • 자신의 글꼴 확인
  • 좋아하는 일본어 폰트에 등록
  • 그래프 작성시에 폰트를 지정

  • 자신이 가진 글꼴 확인


    systemfonts::system_fonts() 를 사용하면 편리합니다. 그러나, 출력량이 많기 때문에, 예를 들면 다음과 같은 코드로 폰트명에 맞추어 검색한다.
    library(dplyr)
    systemfonts::system_fonts() %>% filter(grepl("Hira", family)) %>% select(name, path)
    
    HiraginoSans-W8     /System/Library/Fonts/ヒラキノ角コシック W8.ttc
    HiraginoSansGB-W6   /System/Library/Fonts/Hiragino Sans GB.ttc
    HiraginoSans-W6     /System/Library/Fonts/ヒラキノ角コシック W6.ttc
    HiraMaruProN-W4     /System/Library/Fonts/ヒラキノ丸コ ProN W4.ttc
    ...
    

    좋아하는 일본어 폰트를 등록



    그리기에는 quartzFonts라는 것이 사용되는 것 같기 때문에 위에서 찾은 폰트를 등록한다.
    4개 반복하고 있는 것은 「표준」 「굵은 글씨」 「이탤릭」 「굵은 글씨・이탤릭」의 4종류 등록하는 사양에 대응하기 위해서.
    같은 폰트에서도 그래프 묘화에서는 그다지 곤란하지 않기 때문에 구별하고 있지 않다.
    quartzFonts(hiragino=rep("HiraMaruProN-W4", 4))  # 登録
    quartzFonts()  # 結果を確認
    
    $serif
    'Times-Roman''Times-Bold''Times-Italic''Times-BoldItalic'
    $sans
    'Helvetica''Helvetica-Bold''Helvetica-Oblique''Helvetica-BoldOblique'
    $mono
    'Courier''Courier-Bold''Courier-Oblique''Courier-BoldOblique'
    $hiragino
    'HiraMaruProN-W4''HiraMaruProN-W4''HiraMaruProN-W4''HiraMaruProN-W4'
    

    그래프 작성시 글꼴 지정


  • 그래프의 축이나 타이틀의 폰트는 theme(text=element_text(family="font-name")) 로 지정할 수 있다.
  • 캐릭터 라인을 플롯 하는 경우, geom_textfamily 옵션으로 폰트를 지정할 수 있다.
  • jofont <- "hiragino"
    d <- data.frame(x=c("あいうえお", "かきくけこ", "さしすせそ"), y=c(1, 2, 3)) 
    # gets warnings, but works
    ggplot(d, aes(x, weight=y)) +
      geom_bar(fill="gray50", color="gray10") + 
      geom_text(aes(y=y, label=x), family=jpfont) +
      xlab("横軸") + ylab("縦軸") + ggtitle("タイトル") +
      theme(text=element_text(family=jpfont))
    

    노트북에서 실행했는데, 대량의 경고 “ ポストスクリプトフォントのデータベースにフォントファミリ 'hiragino' が見付かりません ”를 내면서도 그래프가 제대로 출력되었다.



    경고가 싫으면 suppressWarnings를 사용하여 출력을 피할 수 있습니다.
    또는 위에서 정의한 ggshow 함수는 MacBook에서도 작동합니다.

    실행 예



    이 기사의 실행 예 (Gist)

    좋은 웹페이지 즐겨찾기