2016-10-30 12 views
3

geom_rect()を使用して冬の月を陰にしようとしていて、さまざまな開始点と終了点を持つさまざまな時系列データがあります。時系列ごとに、毎年11月から3月の期間を日陰にしたい(残りの月には色付けをしないでください)。 ( - 毎年のためのマルすなわち11月)ggplotを使用して異なる開始点と終了点を持つ時系列データをプロットするとき

temp <- data.frame(
    start = as.Date(c('2016-11-1', '2017-11-01', '2018-11-01', '2019-11-01')), 
    end = as.Date(c('2017-03-01', '2018-03-01', '2019-03-01', '2020-03-01'))) 

dateRanges <- data.frame(
    start = as.POSIXct(temp [,1], "%Y-%m-%d")+ hours(6), 
    end = as.POSIXct(temp [,2], "%Y-%m-%d")+ hours(6)) 
私はスタートした新しいデータフレームのオブジェクトと各シェーディングセクションの終点を定義することができ

library(ggplot2) 
library(lubridate) 

now <- Sys.time() 
set.seed(123) 
datOne <- data.frame(IndID = "One", 
         DateTime = seq(from = now - dyears(0.2), length.out = 50, by = "months"), 
         Value = rnorm(50)) 

次の時系列で例えば

次にプロットしてください。

ggplot(datOne) + 
    geom_rect(data = dateRanges, aes(xmin = start , xmax = end, ymin = -Inf, ymax = Inf), 
      inherit.aes=FALSE, alpha = 0.4, fill = c("lightblue"))+ 
    geom_line(aes(x= DateTime, y = Value), size = 1.5) 

enter image description here

これは、単一の時系列のため正常に動作している間、私は別の開始点と終了点を持ち、独自のデータを必要とし、それぞれが、多くの個々の時系列ごとに個別のフィギュアを作っていますフレームからシェーディング領域を作成する。 たとえば、下の図に示すように、異なる時系列に適用された同じdateRangesデータフレームは明らかに機能しません。それぞれについて、私はdateRangesの作成を自動化するか、すべて一緒に別の方法を使用できますように

datTwo <- data.frame(IndID = "Two", 
         DateTime = seq(from = now , length.out = 100, by = "months"), 
         Value = rnorm(100)) 

ggplot(datTwo) + 
    geom_rect(data = dateRanges, aes(xmin = start , xmax = end, ymin = -Inf, ymax = Inf), 
      inherit.aes=FALSE, alpha = 0.4, fill = c("lightblue"))+ 
    geom_line(aes(x= DateTime, y = Value), size = 1.5) 

は(すなわち、注釈を付け...)2つの時系列日陰に異なる方法があります。異なる言い方をすると、異なる期間に100種類の異なる時系列を持つ100種類の異なる数字を作成する必要があることを考えると、11月〜3月の期間を日陰にする最良の方法は何ですか?

ありがとうございます。

enter image description here

答えて

2

これは、「最良の」方法であれば、私は知りませんが、それは簡単なものだ:あなたのdateRangesフレームを展開し、自分の軸の制限をリセットします。

# let's make it past & future proof for the next few years: 
dateRanges <- data.frame(
    start = seq(as.POSIXct("1900-11-01 07:00:00"), as.POSIXct("2100-11-01 07:00:00"), "1 year"), 
    end = seq(as.POSIXct("1901-03-01 07:00:00"), as.POSIXct("2101-03-01 07:00:00"), "1 year") 
) 
ggplot(datTwo) + 
    geom_rect(data = dateRanges, aes(xmin = start , xmax = end, ymin = -Inf, ymax = Inf), 
      inherit.aes=FALSE, alpha = 0.4, fill = c("lightblue"))+ 
    geom_line(aes(x= DateTime, y = Value), size = 1.5) + 
    coord_cartesian(xlim = range(datTwo$DateTime)) 

enter image description here

2

これを試してみてください:

# make it a function 
get.date.ranges <- function(data) { 
    range.df <- NULL 
    for (year in seq(min(year(data$DateTime)), year(max(data$DateTime)), 1)) { 
    cur <- data.frame(
      start = as.POSIXct(as.Date(paste(year, '-11-1',sep='')), "%Y-%m-%d")+ hours(6), 
      end = as.POSIXct(as.Date(paste(year+1, '-03-1',sep='')), "%Y-%m-%d")+ hours(6) 
     ) 
    if (cur$start <= max(data$DateTime)) { 
     range.df <- rbind(range.df, cur) 
    } 
    } 
    if (nrow(range.df) > 0) { 
    range.df[1,]$start <- max(range.df[1,]$start, min(data$DateTime)) 
    range.df[nrow(range.df),]$end <- min(range.df[nrow(range.df),]$end, max(data$DateTime)) 
    } 
    return(range.df) 
} 

# plot function 
plot.data <- function(data) { 
    ggplot(data) + 
    geom_rect(data = get.date.ranges(data), aes(xmin = start , xmax = end, ymin = -Inf, ymax = Inf), 
       inherit.aes=FALSE, alpha = 0.4, fill = c("lightblue"))+ 
    geom_line(aes(x= DateTime, y = Value), size = 1.5) 
} 

plot.data(datOne) 

enter image description here

plot.data(datTwo) 

enter image description here

関連する問題