はじめに
R でグラフを描くと、普通はY軸のタイトルが90度回転した横書きで表示される。
英語のグラフならばこのように回転した横書きが普通なのだが、日本語のグラフでこのようになっているのは違和感がある。できることならば、以下のように縦書きにしたいところだ。
1行1文字にする
1行に1文字しかない横書きを作ることで、実質的に縦書きのように見せることができる [1] 。
改行を示す記号を「⏎」とすれば、「あ⏎い⏎う⏎え⏎お」のようにすることで、「あいうえお」を縦書きのように表示することができる。つまり、1番上の行に「あ」だけが、その次に「い」だけが、……、そして1番下の行に「お」だけがあるようにすれば、「あいうえお」という文字列が上下に並び、縦書きのようになる [2] 。
このことを図示すると以下のようになる。
上の図のように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文字の横書きにしているだけだから、そのままでは長音符は左右に伸びる棒として表現されてしまう。だから、横書きでも上下に伸びる棒のように見える「丨」に変えたのだ。なお、「丨」はれっきとした漢字で、音は「コン」である。
ここまでできれば、あとは簡単である。
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軸からある程度離れた場所にタイトルが表示されるようになる。この値が小さいと、数字のラベルに重なってしまう。
上記のスクリプトを実行すると、以下のような結果が出力される。
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軸と平行になる形で上下方向に伸びた縦書きのように表示される。
上記のスクリプトの実行結果は以下のようなものになる。
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()
函数の方がシンプルで好きである。
- Rにおいて厳密な意味での縦書きにする方法があるかについては、残念ながら私は知らない。 [↩]
- この手法は、私が最初に思いついたものではなく、Rでの日本語のグラフ作成は割とよく行われているものだ。例えば、dichika氏の「plotで軸タイトルを縦書きにする」や寺沢拓敬氏の「Rでグラフの文字をたて書きにする」といった記事に類例がある。 [↩]
- ただし、このように置き換えると見た目は問題がないのだが、まったく違う字になってしまっているために、文字列検索をしても引っかからなくなってしまうという問題が出る。 [↩]