cucumber flesh

Rを中心としたデータ分析・統計解析らへんの話題をしていくだけ

Rで名刺 ggplot2編

新しい職場で名刺を作る機会があったので、Rで作ることにしました。

Rで名刺を作成するというマニアックな知見は以前からありますが、これらはいずれも標準の作図機能を利用しているもので、せっかくなのでggplot2で作れないかと試行錯誤しました。

松村俊和のページ:日記 / 2007-10

www.yasuhisay.info

これはダミーですが、こんな感じの名刺が出来上がりました。よかったですね。「本物」の名刺はお会いした時に!(私は極度な人見知りなのでだいたい逃げ回ってます)

f:id:u_ribo:20171119152438p:plain

全部のコードはgistにあげています。ここでは、ggplot2を利用してRで名刺を作るための部分的な説明をします。

適当なx、yの値を入力したデータフレームを作って、やっていきます。自分の場合、なんとなくサイズ感が掴めるかなと思い名刺サイズに合わせてみました。また、あらかじめ利用する日本語フォントを指定しておくと文字化けせずにすみます。

ベースを作る

library(ggplot2)
quartzFonts(sans = quartzFont(rep("IPAexGothic", 4)),
            serif = quartzFont(rep("IPAexMincho", 4)))
df <- data.frame(x = 91, y = 55)
p <- ggplot(df, aes(x, y))

p

f:id:u_ribo:20171119152247p:plain

どうみてもggplot2です。本当にありがとうございました。というわけでここから「名刺」として偽装する処理をします。まずは、切れてしまっている元の図を、0を基準として指定したサイズにします。これをしないとあとで加える文字などの要素の配置がうまくいかなくなります。

# 枠を固定する ------------------------------------------------------------------
p <- p + xlim(0, df$x) +
  ylim(0, df$y)

次に背景を白にして、「図」の構成要素となっているラベルや軸を無くしてしまいます。(こんなことして、俺はハドリーに怒られるんじゃないか...という気にもなりますが、気にせず進めます)

# 背景を白く ------------------------------------------------------------------
p <- p + 
  theme_bw(base_size = 12, base_family = "sans") +
  theme(panel.grid.major = element_blank(), panel.grid.minor = element_blank(),
          panel.background = element_blank(), axis.line = element_line(colour = "black"),
          axis.text = element_blank(), axis.title = element_blank(),
          axis.ticks = element_blank(), axis.line.x = element_blank(),
          axis.line.y = element_blank())

ここの画像を出力しても、真っ白なだけで何の面白みもないので貼っていませんが、上のコードを実行すると「枠」があるだけの白い図が出来上がります。やっていることはtheme()の各引数にelement_blank()を指定してデフォルトの要素を消してしまっているのと、theme_bw()でベースとなるフォント(最初に指定したやつ)とそのサイズを定義しているだけです。

文字を入れる

annotate()を使いました(geom_text()を使っても良いです)。文字の配置を引数で指定できて楽です。フォントの大きさや色、種類も指定可能です。

# 文字を入れる ------------------------------------------------------------------
# 要素となる名前などの情報をオブジェクトとしておきます
first_name <- "真也"
last_name <- "瓜生"
first_name_en <- "Shinya"
last_name_en <- stringr::str_to_upper("Uryu")
p + annotate(geom = "text",
         x = (df$x / 2), y = df$y / 2,
         label = glue::glue("{last_name} {first_name}"),
         size = 22,
         family = "sans",
         color = "black") + 
  annotate("text",
           x = (df$x / 2), y = (df$y / 2) - 12,
           label = glue::glue("{last_name_en}, {first_name_en}"),
           family = "serif")

annotate()では位置とラベルの値などを除き、いくつか共通化できる引数の値があったのでpurrr::partial()による部分適用を利用しました。partial()を利用すると上のコードを次のように書き換えられます。

antt <- purrr::partial(annotate, geom = "text", family = "sans", color = "black")
antt_en <- purrr::partial(annotate, geom = "text", family = "serif", color = "black")

p + 
  antt(x = (df$x / 2), y = df$y / 2,
         label = glue::glue("{last_name} {first_name}"),
         size = 22) +
  antt_en(x = (df$x / 2), y = (df$y / 2) - 12,
           label = glue::glue("{last_name_en}, {first_name_en}"))

あとは必要な情報を同様に追加していったり、線を引きたかったらgeom_segment()を実行するなりしてください。文字の配置を考えるのが面倒です。

ロゴを追加する

画像を追加する方法は色々あるみたいですがggimageを使うのが個人的には楽でした。ggplot2の関数と同じような引数が指定できます。

library(ggimage)

p <- p + geom_image(aes(x = 10, y = 48, 
                             image = "r3_logo.png"),
                         size = 0.072) +
  geom_image(aes(x = df$x - 8.4, y = 2),
             image = file.path(Sys.getenv("R_HOME"), "doc", "html", "logo.jpg" ),
             size = 0.0182) +
  geom_image(aes(x = df$x - 10, y = 28),
             image = "uryu.jpg",
             size = 0.182)

QRコードを追加する

完全におまけですが。

QRコードは、qrencoderというパッケージで生成・出力できます。やっていきましょう。といってもQRコードを生成してのっけるだけになります。

library(qrencoder)

png("qr_code.png", bg = "transparent")
par(mar = c(0,0,0,0))
image(qrencode_raster(website), 
      asp = 1, 
      col = c("#FFFFFF", "#19A757"), axes = FALSE, 
      xlab = "", ylab = "")
dev.off()

これをgeom_image()でこれまでの図に追加して完成です!

p + geom_image(aes(x = df$x - 10, y = 10),
             image = "qr_code.png",
             size = 0.10)

ここやgistにあげたコードではglueパッケージを使っているので、適当に値を変えたら同じデザインのものができます!

さあ、あなたもggplot2で名刺を作ろう!!