LoginSignup
11
9

More than 5 years have passed since last update.

[R] ggplot2で等高線を描く

Last updated at Posted at 2015-02-23

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)

demo_contour_diff.png
demo_contour_ratio.png

不満点

等高線に小さな数字がつかないのが寂しいです。コードの読解性や開発時間も重要ですが、図が特に重要な場合はRubyDCLで作図しています。これはデフォルトで等高線に小さな数字がついて最高なんですよ。リンクだけはっておきます。

11
9
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
11
9