備忘ログ

チラシの裏的備忘録&メモ

Rの{zipangu}パッケージでグラフの軸ラベルに漢数字を使う方法

Rの日本語周りの便利パッケージの{zipangu}が0.2.2にバージョンアップされたよ!

前に書いた、漢数字をアラビア数字にその漢数字が意味する数字になるように計算して変換する機能もCRANからインストールできるバージョンでも使えるようになったよ。

indenkun.hatenablog.com

日付や元号の取り扱いや2021年の祝日にも対応したみたいだよ。詳しくはNEWS.mdを読もう。

あと、グラフの軸ラベルに漢数字をつかつための関数が追加されたよ!やったね!!

今回はグラフの軸ラベルに漢数字を使うための関数の使い方を少し書くよ!(自分でPull RequestしたコードがMergeされたから)

{zipangu}をインストールしていなかったり、0.2.2未満の場合は

install.packages("zipangu")

で最新版をインストールしよう。

漢数字を軸ラベルで使うための関数はlabel_kansuji()label_kansuji_suffix()だよ。{ggplot2}のグラフと一緒に使うときに使いやすいように書いたよ。他のグラフ描画形式でも軸ラベルの方式が似ていれば使えると思うよ。

ggplot2で漢数字を軸ラベルに使う

今回は{ggolot2}の例で説明するよ。{ggplot2}をインストールしていなかったら。

install.packages("ggplot2")

でインストールしよう。

label_kansuji()label_kansuji_suffix(){ggplot2}の軸ラベルを調整するための{scales}パッケージのlabel_*()系関数と似たような記法ができるように調整したよ。

今回はデータをWikipediaの日本の人口(1955~1980年)のデータを使うよ。なんでかっていうと、この時期にちょうど日本の人口が1億人を超えたから、桁が一つ上がるときの挙動も見れるからだよ。

# ja_popが日本の人口データのオブジェクト
ja_pop <- structure(list(= c("1955", "1960", "1965", "1970", "1975", "1980"), 
                           総人口 = c(89275529, 93418501, 98274961, 103720060, 111939643, 117060396)), 
                     row.names = c(NA, -6L), 
                     class = c("tbl_df", "tbl", "data.frame"))

とりあえず、普通に{ggplot2}で棒グラフを書くよ。

library("ggplot2")
ggplot(ja_pop) +
  geom_bar(aes(x =, y = 総人口), stat = "identity") 

f:id:indenkun:20210202233146p:plain

ふーんって感じだけど、e+数字の表記に慣れていないと結構読みにくいね。解決策としては{scales}パッケージのいくつかの関数が解決策としてあるよ。{scales}は多分{ggplot2}の依存関係ですでにインストールされていると思うよ。

たとえば

library("scales")
ggplot(ja_pop) +
  geom_bar(aes(x =, y = 総人口), stat = "identity") +
  scale_y_continuous(labels = label_comma())

f:id:indenkun:20210202233205p:plain

コンマを三桁ごとに打っているとそういう表記に普段から慣れている人には見やすいね。だけど、そうじゃない人はちょっと見にくいね。他にもK、M、T表記するための関数などいろいろあるよ。

ただ、日本人的には値は漢数字だと見やすい(読みやすい)よね。そのまま順番に読めばいいだけだから。ということで{zipangu}の新しい関数のlabel_kansuji()を使ってみるよ。

library("zipangu")
ggplot(ja_pop) +
  geom_bar(aes(x =, y = 総人口), stat = "identity") +
  scale_y_continuous(labels = label_kansuji())

f:id:indenkun:20210202233219p:plain

一番大きな値が0の数を数えなくてもすぐに1億2000万ってわかるようになるね。

デフォルトでは万、億、兆、京の桁とアラビア数字混じりになるけどすべて漢数字にすることもできるよ。

ggplot(ja_pop) +
  geom_bar(aes(x =, y = 総人口), stat = "identity") +
  scale_y_continuous(labels = label_kansuji(number = "kansuji"))

f:id:indenkun:20210202233232p:plain

みやすさは好みや場面の問題もあるかもね。

アラビア数字の後ろに万や億や兆、京を一文字だけつけるlabel_kansuji_suffix()もあるよ。

ggplot(ja_pop) +
  geom_bar(aes(x =, y = 総人口), stat = "identity") +
  scale_y_continuous(labels = label_kansuji_suffix())

f:id:indenkun:20210202233245p:plain

1.2億って日本語的じゃないけど、文字数が少なくてスッキリするし、グラフにするならそんなに違和感ない……と個人的には思っているよ。

いずれの場合も、{scales}の関数群のように色々装飾できるようにしているよ。

ggplot(ja_pop) +
  geom_bar(aes(x =, y = 総人口), stat = "identity") +
  scale_y_continuous(labels = label_kansuji(unit = "人"))

f:id:indenkun:20210202233257p:plain

グラフってパッとみてわかることが求められることも多いから、あんまり0の数がたくさんあると見たときにすぐにいくつなのかちょっと考えちゃつけど、4桁ごとに漢数字で区切られていたり、一番大きな桁の漢数字がわかると結構ぱっとみたときの値の理解が早い気がする。

特に普段から大きい値をアラビア数字で見慣れていなかったり、そもそもグラフを見慣れていない場合にはそういうことが多いと勝手に思い込んでいるから、そういう対象になにか大きな値をグラフで示すときにはこういう手法がわかりやすくていいかもしれない。

全然関係ない雑感

この関数を{zipangu}にPull Requestしたときに、Descriptionの依存関係のパッケージのバージョンを書いてねっていわれて、そのときにusethis::use_latest_dependencies()使ったらいいよっていわれて、その時初めてその関数のことを知って、「へぇ~、便利関数だなぁ。」と思った。

{usethis}とかのRパッケージ作成支援系のパッケージや関数群はどこまで使ってる&どこまで使える&どうやって使い切るんだろうなって思った。多分使いこなせばかなりパッケージ作成が楽になりそうだと思った。

パッケージ作成にで使う技術?的なのはR Packages(ただし日本語訳版。ちょっと古いけど調べるとすぐに最新でどうするかわかる。)に書いてあることや、CRAN Policyに書いてあることと、時々に色んな人が日本語でブログでまとめてくれているぐらいしかわからないから、知らないテクニックや関数があるんだろうなぁと思ってる。

けれど、なかなかそういうのをどうやって知ればいいのかわからないし、あんまり日本語でまとまった文書がないなぁ(自分が見つけられていないだけかもしれない)って思ってる。日本語でまとまったテキストがあればすごく便利なんだろうけど、ニッチ過ぎて需要に乏しいのかもしれないし、R Pacakegesの例なんかもそうだけど結構テクニック系は廃れたりしていくことが多いのかなって思った……。そもそもパッケージ作成過程で多少の英語必須だから英語のReferenceちゃんと読めよっていわれたそうなんだけどね(英語苦手だし、ちょっとしたニュアンス的なのわからないし、Rがわからなくて読めないのか、英語がわからなくて読めないのかわからなくなってくるし)。基本的なことはR PacakegesとかCRAN Policyで抑えられるけどね(CRAN Policyもいまいち、というか全然わかりにくいところがあってそれはRがわからなくてわからないのか、英語がわからなくてわからないのかわかっていない)。

自分はあんまりRパッケージ作るほうじゃないから、必要にかられてとかいう学習動機に乏しいのもあるかもしれない。