Rでグラフを描くときにY軸のタイトルを縦書きにする

概要
R で plot() や ggplot2 パッケージを使って日本語のグラフを描く際に、Y軸のタイトルを縦書きのように表示させる方法についての説明。1行に1文字しかない横書きを作ることで、縦書きのように見せることができる。

はじめに

R でグラフを描くと、普通はY軸のタイトルが90度回転した横書きで表示される。

特に何も調整せずにグラフを描くと、Y軸のラベル(ここでは「ダイアモンドの価格」)が90度回転した横書きで表示されてしまう。
特に何も調整せずにグラフを描くと、Y軸のラベル(ここでは「ダイアモンドの価格」)が90度回転した横書きで表示されてしまう。

英語のグラフならばこのように回転した横書きが普通なのだが、日本語のグラフでこのようになっているのは違和感がある。できることならば、以下のように縦書きにしたいところだ。

Y軸のラベルを縦書きにした例。
Y軸のラベルを縦書きにした例。

1行1文字にする

1行に1文字しかない横書きを作ることで、実質的に縦書きのように見せることができる [1]

改行を示す記号を「」とすれば、「あ⏎い⏎う⏎え⏎お」のようにすることで、「あいうえお」を縦書きのように表示することができる。つまり、1番上の行に「あ」だけが、その次に「い」だけが、……、そして1番下の行に「お」だけがあるようにすれば、「あいうえお」という文字列が上下に並び、縦書きのようになる [2]

このことを図示すると以下のようになる。

1行に1文字しかない横書きで、実質的に縦書きのように見せることができることを示した図。図の右側に示されているように、実際の構造としては横書きで1文字ごとに改行された5つの行が並んでいる。しかし、図の左側に示されているように、表面的には縦書きのように見える。
1行に1文字しかない横書きで、実質的に縦書きのように見せることができることを示した図。図の右側に示されているように、実際の構造としては横書きで1文字ごとに改行された5つの行が並んでいる。しかし、図の左側に示されているように、表面的には縦書きのように見える。

上の図のように1行に1文字しかない横書きを作るためには、個々の文字の間に改行を入れれば良い。つまり、もとが「あいうえお」ならば、「あ⏎い⏎う⏎え⏎お」のようにすれば良いのだ。Rでこのような操作を行いたければ、以下の tategaki() のような函数を作れば良い。

tategaki <- function(x){
  x <- chartr("ー", "丨", x) # 長音符の処理
  x <- strsplit(split="", x)
  sapply(x, paste, collapse="\n")
}

例えば、「あいうえお」という文字列をこの函数に与えれば、以下のような形で返ってくる。

> tategaki("あいうえお")
[1] "あ\nい\nう\nえ\nお"

なお、先ほど tategaki() という函数を作ったときに、長音符の処理として chartr("ー", "丨", x) と書いた。これは、与えられた文字列の中の「ー」(長音符)を「丨」に置き換えるハックだ [3] 。長音符は、横書きでは左右に伸びる棒として表されるが、縦書きでは上下に伸びる棒として表される。しかし、ここではあくまでも1行1文字の横書きにしているだけだから、そのままでは長音符は左右に伸びる棒として表現されてしまう。だから、横書きでも上下に伸びる棒のように見える「丨」に変えたのだ。なお、「丨」はれっきとした漢字で、音は「コン」である。

単純に1行1文字にすれば、長音符が違和感のある形になるが、縦棒の形をした「丨」に置き換えた上で、1行1文字にすれば、縦書きとして違和感のないものになる。
単純に1行1文字にすれば、長音符が違和感のある形になるが、縦棒の形をした「丨」に置き換えた上で、1行1文字にすれば、縦書きとして違和感のないものになる。

ここまでできれば、あとは簡単である。

plot() の例

R の普通の plot() で作るグラフでY軸のタイトルを縦書きにする例を紹介しよう。以下のスクリプトでは、100個の正規乱数を2組作り、その2組の関係を示す散布図を作っている。

plot(rnorm(100), rnorm(100),
     xlab = "これは横書きがうれしいでーす", ylab = "", las = 1)
mtext(tategaki("これは縦書きがうれしいでーす"),
      side = 2, las = 1, line = 3)

ここで、plot() 函数を実行するときに ylab = ""と指定することで、通常のY軸のタイトルが出力されないようにしている。また、plot() 函数を実行するときに las = 1と指定することで、Y軸の数値を示すラベルが水平方向に伸びる横書きになるようにしている。Y軸のタイトルは、mtext() 函数を使って後から追加する。side = 2 を指定することで、グラフの左側、すなわちY軸の左横に文字が出力される。las = 1と指定することで、タイトルが変な方向に回転することなく、Y軸の左横にまっすぐ表示されるようになる。line = 3と指定することで、Y軸からある程度離れた場所にタイトルが表示されるようになる。この値が小さいと、数字のラベルに重なってしまう。

上記のスクリプトを実行すると、以下のような結果が出力される。

plot() と mtext() を使ったグラフでY軸のラベルを縦書きのように見せた例。「これは縦書きがうれしいでーす」というY軸のタイトルが縦書きのように表示されている。
plot()mtext() を使ったグラフでY軸のラベルを縦書きのように見せた例。「これは縦書きがうれしいでーす」というY軸のタイトルが縦書きのように表示されている。

ggplot2 パッケージの例

次に、ggplot2 パッケージのグラフでY軸のタイトルを縦書きにする例を紹介しよう。以下のスクリプトは、ggplot2 パッケージに含まれる diamonds というデータセットから、ダイアモンドの重さとダイアモンドの価格の関係を示した散布図を作成する。

library("ggplot2")
g <- ggplot(diamonds, aes(x = carat, y = price)) +
  geom_point()

g + xlab("ダイアモンドの重さ") +
  ylab(tategaki("ダイアモンドの価格")) +
  theme(axis.title.y = element_text(angle = 0, vjust= 0.5))

ggplot2 パッケージでは、ylab() 函数でY軸のタイトルを指定することができるが、先ほど作ったtategaki() 函数を組み合わせることで、1行1文字の形のタイトルにすることができる。そして、このスクリプトの最後の行の指定により、Y軸のタイトルがY軸と平行になる形で上下方向に伸びた縦書きのように表示される。

上記のスクリプトの実行結果は以下のようなものになる。

ggplot2 パッケージのグラフでY軸のラベルを縦書きのように見せた例。
ggplot2 パッケージのグラフでY軸のラベルを縦書きのように見せた例。

1行1文字にする別の方法

stringr パッケージがインストールされている環境であれば、以下のような tategaki_alt() 函数を作ることで1行1文字にすることができる。

tategaki_alt <- function(x){
  x <- stringr::str_replace_all(x, "ー", "丨") # 長音符の処理
  stringr::str_wrap(x, width = 1)
}

個人的には、先に紹介した tategaki() 函数よりも、こちらの tategaki_alt() 函数の方がシンプルで好きである。

この記事で紹介したソースコードは、GitHub にアップロードしてある。
脚注
  1. Rにおいて厳密な意味での縦書きにする方法があるかについては、残念ながら私は知らない。 []
  2. この手法は、私が最初に思いついたものではなく、Rでの日本語のグラフ作成は割とよく行われているものだ。例えば、dichika氏の「plotで軸タイトルを縦書きにする」や寺沢拓敬氏の「Rでグラフの文字をたて書きにする」といった記事に類例がある。 []
  3. ただし、このように置き換えると見た目は問題がないのだが、まったく違う字になってしまっているために、文字列検索をしても引っかからなくなってしまうという問題が出る。 []