pandazx's blog

Hadoop, データ分析など雑多な技術ブログ

Rのggplotでヒートマップ作成時にログスケールとlimitsかけてエラー

例えば、以下のようにヒートマップを作成してエラーになったとする。

library(ggplot2)
library(reshape2)
library(ggthemes)

# data.csv には val1, val2, valueというカラムがある
data<-read.table("data.csv", header=T, sep=",")

# ヒートマップ作成
p <- ggplot(data,aes(as.factor(val1),as.factor(val2)))
# 頻度を対数変換して、limitsも指定
p + geom_tile(aes(fill=value)) + scale_fill_gradientn(colours=rainbow(7), trans = 'log', limits=c(0,10))
 以下にエラー seq.default(min, max, by = by) : 
  'from' cannot be NA, NaN or infinite

対策1:事前に対数変換

limitsの指定で足切りになったデータがNAになったことが原因なので、 以下のように事前に対数変換しておけば、エラーにならない。

data2<-transform(data, log_value=log(data$value))
p<-ggplot(data2,aes(as.factor(val1),as.factor(val2)))
p+geom_tile(aes(fill=log_value))+scale_fill_gradientn(colours=rainbow(7), limits=c(NA,10))

対策2:limitsの最小値にNAを指定

p <- ggplot(data,aes(as.factor(val1),as.factor(val2)))
p + geom_tile(aes(fill=value)) + scale_fill_gradientn(colours=rainbow(7), trans = 'log', limits=c(NA,10))

参考

これとは別の話で、横軸を対数軸にする話は以下。

ggplot2 で対数軸の目盛を変更 - joker8phoenix's diary