Rで等高線やヒートマップを描くにはいくつか方法があります。
Rのデフォルトの気に食わない点
特にインストールしなくても使えるimage()関数を使う方法がメジャーと思いますが、慣れていないとデータと図の向きが思っていたのと逆になったりして発狂します。
{ggplot2}を使う方法の紹介
データの縦持ちに慣れてしまったggplot2脳をお持ちの方にはぜひこちらをおすすめしたいです。
draw_contour.R
library(ggplot2)
## 等高線やヒートマップを描くのにキモとなるdata.frameを作成
N <- 60
x <- seq(0, 100, length=N)
d.cont <- data.frame(x=rep(x,N), y=rep(x,each=N))
d.cont <- transform(d.cont,
z.diff=x-y,
z.ratio=ifelse(x+y==0, 0.5, x/(x+y))
)
## 等高線上にプロットする点 (別になんでもOK)
set.seed(123)
d.point <- data.frame(x=runif(20, 0, 100), y=runif(20, 0, 100))
## 差の等高線
p <- ggplot()
p <- p + geom_tile(data=d.cont, aes(x=x, y=y, z=z.diff, fill=z.diff), alpha=0.6)
p <- p + geom_contour(data=d.cont, aes(x=x, y=y, z=z.diff, fill=z.diff), color='black', size=1, alpha=0.3)
p <- p + geom_point(data=d.point, aes(x=x, y=y), color='black', size=2, alpha=0.8)
p <- p + geom_abline(aes(slope=1, intercept=0), color='black', alpha=0.4, size=2)
p <- p + scale_fill_gradient2(low='blue', mid='white', high='red')
p <- p + coord_cartesian(xlim=c(0, 100), ylim=c(0, 100))
ggsave(p, file='demo_contour_diff.png', dpi=300, w=6, h=5)
## 比の等高線
p <- ggplot()
p <- p + geom_tile(data=d.cont, aes(x=x, y=y, z=z.ratio, fill=z.ratio), alpha=0.6)
p <- p + geom_contour(data=d.cont, aes(x=x, y=y, z=z.ratio, fill=z.ratio), color='black', size=1, alpha=0.3)
p <- p + geom_point(data=d.point, aes(x=x, y=y), color='black', size=2, alpha=0.8)
p <- p + geom_abline(aes(slope=1, intercept=0), color='black', alpha=0.4, size=2)
p <- p + scale_fill_gradient2(midpoint=0.5, low='blue', mid='white', high='red')
p <- p + coord_cartesian(xlim=c(0, 100), ylim=c(0, 100))
ggsave(p, file='demo_contour_ratio.png', dpi=300, w=6, h=5)
不満点
等高線に小さな数字がつかないのが寂しいです。コードの読解性や開発時間も重要ですが、図が特に重要な場合はRubyDCLで作図しています。これはデフォルトで等高線に小さな数字がついて最高なんですよ。リンクだけはっておきます。