xkcdでひと味ちがうグラフを描く

中心がずれた円グラフとか、胸に迫る3Dグラフなど素敵な可視化が巷に溢れている昨今、皆さん客観性を保つ可視化リテラシーとはなにかということについて頭を悩まされていると思いますがそんな現状に鉄槌を下す素敵なパッケージがあります。その名はxkcd。
もとは以下のstackoverflowに寄せられた質問から。
http://stackoverflow.com/questions/12675147/how-can-we-make-xkcd-style-graphs-in-r
xkcdは主に棒人間が活躍するwebコミックで作者はNASAで働いてたとのこと。
http://xkcd.com/
xkcdパッケージはその味わい深いwebコミックのテイストをRのグラフ上で再現できます。素晴らしいですね。
ということで以下棒人間を描くまでの手順。
詳しい話はVignette参照のこと。
http://cran.r-project.org/web/packages/xkcd/vignettes/xkcd-intro.pdf

xkcdフォントをインストールする

下手くそな手書きフォントxkcdをインストールする。
以下はWindows7の場合の話。他環境の場合はVignetteにコマンド付きでやり方が書いてあるのでそちらを参照。

  1. http://simonsoftware.se/other/xkcd.ttf からフォントファイルをダウンロード
  2. xkcd.ttfのアイコン上で右クリック→インストール

xkcdで味わい深いプロットを描く

extrafontパッケージでxkcdフォントを指定して、xkcdパッケージでグダグダなグラフを描くという流れになります。

### extrafontパッケージでxkcdフォントを指定する
library(extrafont)
font_import(pattern="xkcd")
loadfonts()
windowsFonts(xkcd=windowsFont("xkcd"))

### 棒人間を描く
library(xkcd)
ratioxy <- diff(xrange)/diff(yrange)
mapping <- aes(x, y,
               scale,
               ratioxy,
               angleofspine ,
               anglerighthumerus,
               anglelefthumerus,
               anglerightradius,
               angleleftradius,
               anglerightleg,
               angleleftleg,
               angleofneck,
               linetype=city)
# 棒人間の指定
dataman <- data.frame(x= c(15,30), y=c(3, 4),
                      scale = c(0.3,0.51) ,
                      ratioxy = ratioxy,
                      angleofspine = -pi/2 ,
                      anglerighthumerus = c(pi/4, -pi/6),
                      anglelefthumerus = c(pi/2 + pi/4, pi +pi/6),
                      anglerightradius = c(pi/3, -pi/3),
                      angleleftradius = c(pi/3, -pi/3),
                      anglerightleg = 3*pi/2 - pi / 12,
                      angleleftleg = 3*pi/2 + pi / 12 ,
                      angleofneck = runif(1, 3*pi/2-pi/10, 3*pi/2+pi/10),
                      city=c("Liliput","Brobdingnag"))
q <- ggplot() + geom_point(aes(mpg, wt, colour=as.character(vs)), data=mtcars) +
    xkcdaxis(xrange,yrange) + xkcdman(mapping, dataman) + theme(legend.position="none")
q

こんな感じの実に味わい深いグラフが描ける。

enjoy!!!