鶴見教育工学研究所

Rのグラフィックスで日本語や記号を化け・ヌケなく表示する

Tags:

結論

RStudioの中では

raggパッケージを描画に使用するよう設定しましょう。

PNG / JPEGの場合

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
library(tidyverse)
library(rpart)
library(partykit)
library(ggparty)
library(ragg) # パッケージをインストールする

colnames(iris) <- c("がく片長","がく片幅","花びら長","花びら幅", "種")

res <- rpart(~ ., data = iris)

#---ここが本題!---#
# plot() 関数の結果を出力する場合
## png形式の場合、agg_png() 関数を使う
agg_png("rpart_plot.png", width=1280, height=1280,
  pointsize=24, res=120)
plot(as.party(res))
dev.off()

## jpeg形式の場合、agg_jpeg() 関数を使う
agg_jpeg("rpart_plot.jpg", width=1280, height=1280,
  pointsize=24, res=120)
plot(as.party(res))
dev.off()
#---ここまで本題!---#

# ggplot2で作成したグラフィックスを ggsave() 関数で出力する場合
p <- ggparty(as.party(res)) +
    geom_edge() +
    geom_edge_label(aes(label = prettyNum(breaks_label,
      digits = 1)), size = 4) +
    geom_node_label(aes(label = splitvar), ids = "inner") +
    geom_node_plot(
        gglist = list(geom_bar(aes(x = "", fill =),
          position = "fill"), theme_bw(base_size = 15)),
        scales = "fixed", id = "terminal",
        shared_axis_labels = TRUE,
        shared_legend = TRUE, legend_separator = TRUE)

#---ここが本題!---#
# ggsave() では raggパッケージがインストールされていれば
# デフォルトで使用される
ggsave("ggparty_ggsave.png", p, width=1280, height=1280,
  units="px", dpi=120, bg = "white")
#---ここまで本題!---#
plot() 関数の出力結果: 左が png() デバイス、右が ragg::agg_png() デバイス

plot() 関数の出力結果: 左が png() デバイス、右が ragg::agg_png() デバイス

ggsave() 関数の出力結果: 左が png() デバイス、右が ragg::agg_png() デバイス

ggsave() 関数の出力結果: 左が png() デバイス、右が ragg::agg_png() デバイス

PDFの場合

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
library(tidyverse)
library(rpart)
library(partykit)
library(ggparty)
library(systemfonts) # パッケージをインストールする

colnames(iris) <- c("がく片長","がく片幅","花びら長","花びら幅", "種")
res <- rpart(~ ., data = iris)

#---ここが本題!---#
# cairo_pdf() 関数を使う
cairo_pdf("rpart_plot.pdf", width=12, height=12,pointsize=24,
  family="Meiryo UI")
plot(as.party(res))
dev.off()
#---ここまで本題!---#

# ggplot2で作成したグラフィックスを ggsave() 関数で出力する場合
p <- ggparty(as.party(res)) +
    geom_edge() +
    geom_edge_label(aes(label = prettyNum(breaks_label,
      digits = 1)), size = 4) +
    geom_node_label(aes(label = splitvar), ids = "inner") +
    geom_node_plot(
        gglist = list(geom_bar(aes(x = "", fill =),
          position = "fill"), theme_bw(base_size = 15)),
        scales = "fixed", id = "terminal",
        shared_axis_labels = TRUE,
        shared_legend = TRUE, legend_separator = TRUE)

#---ここが本題!---#
ggsave("ggparty_ggsave.pdf", p, width=12, height=12,
  units="cm", dpi=120, bg = "white", device=cairo_pdf,
  family="Meiryo UI")
#---ここまで本題!---#
plot() 関数の出力結果: 左が pdf() デバイス、右が cairo_pdf() デバイス

plot() 関数の出力結果: 左が pdf() デバイス、右が cairo_pdf() デバイス

ggsave() 関数の出力結果: 左が pdf() デバイス、右が cairo_pdf() デバイス

ggsave() 関数の出力結果: 左が pdf() デバイス、右が cairo_pdf() デバイス

上の結論だけで十分だと思いますが…少し説明

タイトルは文字数の関係でやや対象が広くなっていますが、実際には、(1) Windows環境で (2) RのグラフィックスをPNG / JPEG / PDF出力する (3) 日本語が表示されればフォントの種類にこだわらない 時の話です。(1) OSを限定しない、(2) より汎用的な出力形式で (3) 任意のフォントを使う 場合についての解説として、以下のようなものがあります。

ただ、長くてムズカシイんで…。Rを長く、本格的に使う方は、Rがフォントを取り扱う仕組みなども学習するとよいと思いますが、「ネット記事をコピペしてRでグラフを描いたら文字が出ない!明日レポートの提出なのに!」といった “普通の” 方には、「とりあえずこうしたら解決するよ」という情報を提示するのも重要かなと思います。

raggパッケージを用いたPNG / JPEG形式の出力

グラフィックスをファイルに出力する場合、PNG / JPEGとPDFでは、方法が異なります。PNG / JPEGについては、近年利用が広まっているraggパッケージを使うと簡単です。標準ではインストールされていないので、install.packages("ragg") としてインストールしましょう。

RStudioでは、標準でグラフィックスにraggパッケージのデバイスを使う機能が組み込まれているので、それを選択するだけで、文字化け・ヌケはなくなります。[Tools] - [Global Options] - [General] - [Graphics] から設定します。また、その操作の際、raggパッケージがインストールされていなければ自動的にインストールもしてくれます。

RStudioにおいてraggパッケージを利用する設定

RStudioにおいてraggパッケージを利用する設定

設定を行ったうえで、[Plots] タブの [Export] ボタンからPNG / JPEGファイルに出力すれば、文字化け・ヌケのないグラフィックスが得られます。

ただしこれは、あくまでRStudioのPlotsタブの設定なので、RStudioを使っていても、プログラム中で png() 関数や ggsave() 関数を使っている部分には反映されません。

プログラム中でグラフィックスを出力したい場合は、raggパッケージが提供する agg_png()agg_jpeg() デバイスを使います。

1
2
3
4
5
6
7
8
9
library(ragg)
...
agg_png("ファイル名",...)
plot(...)
dev.off()

agg_jpeg("ファイル名",...)
plot(...)
dev.off()

ggplot2を使う場合、ggsave() 関数ではraggパッケージがインストールされていれば、デフォルトで使用されるため、特にデバイス名を指定する必要はありません。

1
ggsave("ファイル名",...)

systemfontsパッケージを用いたPDF形式の出力

PDFの場合、伝統的には、pdf(..., family="Japan1GothicBBB") と指定する方法があります。ただ、これはフォントを埋め込まず、「日本語のゴシック体」という概念を指定しているだけなので、実際にどのようなフォントで表示されるかはPDFリーダーとOSの設定次第になります。特に、Webサービスなどでは日本語を表示する設定がされていないことが多く、アップロードしたファイルで日本語がヌケてしまうことが多いです。

そのため、PDFにフォントを埋め込むほうが安全です。こちらも、伝統的にいろいろな方法が提案されてきました。

2022年現在、もっとも手軽な方法は、systemfontsパッケージを使う方法だと思います。Windowsでは、インストールしたフォントをそのまま扱えます。また、OSにインストールしたフォントを使用するには、cairo_pdf() デバイスを使用します。

プログラム例は以下のようになります。

1
2
3
library(systemfonts)
...
cairo_pdf("ファイル名", ..., family = "フォント名")

ggplot2を使う場合も、ggsave() 関数の device オプションと family オプションで日本語フォントを使用できるようになります。

1
ggsave("ファイル名", ..., device=cairo_pdf, family="フォント名")

なお、お使いのWindowsで使用できるフォントの情報は、systemfontsパッケージの system_fonts() 関数で得られます。以下は、筆者の環境での例です。

1
2
library(systemfonts)
system_fonts() %>% filter(str_detect(name, "Meiryo"))
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
## # A tibble: 8 × 9
##   path                              index name                family   
##   <chr>                             <int> <chr>               <chr>    
## 1 "C:\\Windows\\Fonts\\meiryo.ttc"      0 Meiryo              Meiryo   
## 2 "C:\\Windows\\Fonts\\meiryo.ttc"      1 Meiryo-Italic       Meiryo   
## 3 "C:\\Windows\\Fonts\\meiryo.ttc"      2 MeiryoUI            Meiryo UI
## 4 "C:\\Windows\\Fonts\\meiryo.ttc"      3 MeiryoUI-Italic     Meiryo UI
## 5 "C:\\Windows\\Fonts\\meiryob.ttc"     0 Meiryo-Bold         Meiryo   
## 6 "C:\\Windows\\Fonts\\meiryob.ttc"     1 Meiryo-BoldItalic   Meiryo   
## 7 "C:\\Windows\\Fonts\\meiryob.ttc"     2 MeiryoUI-Bold       Meiryo UI
## 8 "C:\\Windows\\Fonts\\meiryob.ttc"     3 MeiryoUI-BoldItalic Meiryo UI
##   style       weight width  italic monospace
##   <chr>       <ord>  <ord>  <lgl>  <lgl>    
## 1 Regular     normal normal FALSE  FALSE    
## 2 Italic      normal normal TRUE   FALSE    
## 3 Regular     normal normal FALSE  FALSE    
## 4 Italic      normal normal TRUE   FALSE    
## 5 Bold        bold   normal FALSE  FALSE    
## 6 Bold Italic bold   normal TRUE   FALSE    
## 7 Bold        bold   normal FALSE  FALSE    
## 8 Bold Italic bold   normal TRUE   FALSE

R Markdownの場合

R Markdown文書では、setup チャンクに以下のように書いておけば、文書内で作成するグラフィックスのデバイスを指定できます。

```{r setup, include=FALSE}
knitr::opts_chunk$set(cache = FALSE, dev = "ragg_png")
```

Posit Cloudの場合

Posit Cloud (旧RStudio Cloud) では、裏で動いているOS (Ubuntu Linux) が「標準の日本語フォント」を知らないので、出力時に family を明示する必要があります。Posit CloudにはIPAexフォントがインストールされているので、family = "IPAexGothic" といったように指定すればよいでしょう。

まとめ

昔に比べれば、Rのグラフィックスにおける日本語の表示は格段に簡単になりました。フォントやそのバックエンドの知識がなくても、「とりあえずragg」「とりあえずsystemfonts」を使えば、表示できます。

論文や社内文書などでも、「MSゴシックで」などアホみたいなフォントの指定が求められることがありますが、この記事で紹介した方法で対応可能です。