Rとggplotでダブルプロットを作る

めちゃくちゃ久しぶりに備忘録。
Rにてダブルプロット。
ggplot2のgeom_rasterを使ってる。

こんなかんじ。

	
library(ggplot2)

.doublePlot<-function(z, start.datetime, one.day.size, max.count=NULL){
  
  bin.size.in.secs<-(60*60*24)%/%one.day.size
  if (is.null(max.count)) max.count<-max(z)
  if (length(z)%%one.day.size!=0) z<-z[seq((length(z)%/%one.day.size)*one.day.size)]
		
  df1<-expand.grid(time=start.datetime+(seq(one.day.size)-1)*bin.size.in.secs, 
    day=seq(length(z)%/%one.day.size))
  df1$z<-z/max.count

  df2<-expand.grid(time=60*60*24+start.datetime+(seq(one.day.size)-1)*bin.size.in.secs, 
    day=seq(length(z)%/%one.day.size))
  df2$z<-c(z[seq(length(z)-one.day.size)+one.day.size], rep(NA, one.day.size))/max.count

  p<-ggplot(rbind(df1, df2))
  p<-p+geom_raster(aes(x=time, y=day, fill=z))
  p<-p+scale_x_datetime(breaks=start.datetime+60*60*6*(0:8),
    labels = scales::date_format("%H:%M"), expand=c(0,0))
  p<-p+scale_y_reverse(breaks=c(seq(length(z)%/%one.day.size)),
    expand=c(0,0))
  p<-p+scale_fill_gradient(low="white", high="black")

}

サンプルデータをかってにつくって、表示してみる。

z<-as.vector((rbind(matrix(rnorm(12*12*30, mean=1000, sd=1000), ncol=30),
  matrix(rnorm(12*12*30, mean=100, sd=500), ncol=30)))^2)
z[sample(seq(12*24*30),3000)]<-z[sample(seq(12*24*30),3000)]
	
start.datetime<-strptime("201311070600", format="%Y%m%d%H%M")
one.day.size<-12*24
print(.doublePlot(z, start.datetime, one.day.size))

genshiro

シェアする