ggplot2で画像にテキストを重ねる

昨日はJapan.Rでした。私はまったく仕事しないただの雑用でしたが、@gepuro、@wonder_zone、@kyyonko、@u_riboをはじめとする運営の活躍と、参加者の方の協力によって楽しい時間になりました。ありがとうございました。

さて、LTの終盤、こんな怪しい人が「闇と向き合う」という発表をしていました。

ここで思うことはひとつしかありません。

なんて素材価値が高い画像なんだ…!

ここで、実際に闇と向き合うにあたって人は何をするか、考えてみましょう。

闇と向き合うためには、コラ画像をツイートして自らを鼓舞することが必要不可欠です。去年のLTで闇と向き合った話をされていた方も、こんなツイートをしています。

ということで、闇と向き合うためにこの画像とまずは向き合ってみることにします。

画像をダウンロード

まずは、素材となる画像をダウンロードします。もちろんRstudioからdownload.file()します。

download.file("https://pbs.twimg.com/media/CVc3iI1UAAA-9wz.jpg:large", destfile = "yami.jpg")

すると、なぜかよく分からないんですが、画像が壊れてしまいました...。

これはこれで更なる闇の存在を感じるので、このまま使うことにします。

画像の読み込み

jpegパッケージで読み込みます。

img <- jpeg::readJPEG("yami.jpg")

画像をプロットする

画像をプロットするのは、色々方法があるとは思いますが、使い慣れてるのでggplot2を使います。

ラスター画像をプロットするためにannotation_raster()というものが用意されています。画像をプロット領域いっぱいに表示するには

annotation_raster(img, -Inf, Inf, -Inf, Inf)

のように、xmin, xmax, ymin, ymaxInf/-Infを指定します。

これだけではプロットできないので、適当なダミーデータをggplot()に渡してつなげます。

ggplot(data.frame(x=0,y=0),aes(x,y)) +
  annotation_raster(img, -Inf, Inf, -Inf, Inf)

すると、こんな感じの結果が出てくるはずです。

f:id:yutannihilation:20151206200228j:plain:w300

文字をプロットする

文字をプロットするのはannotate()です。

ggplot(data.frame(x=0,y=0),aes(x,y)) +
    annotation_raster(img, -Inf, Inf, -Inf, Inf) +
    annotate("text", label = "Why are you...", x = 0, y = 0, colour = "white", size = 20)

f:id:yutannihilation:20151206201104j:plain:w300

ここで、xyを指定していますが、プロットの領域に表示されるxとyの範囲は自動で変わってしまうので、xlim()ylim()で固定します。(ggplot2 1.1.0ならlims()という関数もあります)

ggplot(data.frame(x=0,y=0),aes(x,y)) +
    annotation_raster(img, -Inf, Inf, -Inf, Inf) +
    annotate("text", label = "Why are you...", x = 0.5, y = 0.7, colour = "white", size = 20) +
    xlim(0, 1) + ylim(0, 1)

f:id:yutannihilation:20151206201539j:plain:w300

X軸、Y軸を取り除く

x軸とかy軸が邪魔です。私たちは闇と直接向き合いたいのです。x軸やy軸に邪魔だてされる筋合いはありません。

そんなとき、ggplot2 1.1.0なら、theme_void()というものが用意されています。

New theme_void() is completely empty. It's useful for plots with non- standard coordinates or for drawings (@jiho, #976). (https://github.com/hadley/ggplot2/blob/master/NEWS.md#new-and-updated-themes)

これで完成です。

ggplot(data.frame(x=0,y=0),aes(x,y)) +
    annotation_raster(img, -Inf, Inf, -Inf, Inf) +
    annotate("text", label = "Why are you...", x = 0.5, y = 0.6, colour = "white", size = 20) +
    xlim(0, 1) + ylim(0, 1) +
    theme_void()

f:id:yutannihilation:20151206202144j:plain:w300

闇と向き合えそうな気がしてきたところで、これをパッケージにしました。

mukiauパッケージ

インストール

※これはtheme_void()を使っているので、開発版のggplot2のインストールが必要です。

devtools::install_github("yutannihilation/mukiau")

使い方

mukiau()に、闇と向き合うにあたって叫びたい呪文を入れます。

mukiau("なぜあなたはCP932などを使うのですか?")

折り返しの文字数はwrap_width引数に指定できます。折り返しは区切り文字で折り返すようになっていますが、force_wrap引数にTRUEを設定すると強制的にその文字数で折り返します。日本語などはTRUEの方がいいでしょう。

mukiau("なぜあなたはCP932などを使うのですか?", wrap_width = 15, force_wrap = TRUE)

f:id:yutannihilation:20151206203122j:plain

Enjoy in the dark!!!