web-dev-qa-db-ja.com

Rで時系列シェーディングにgeom_rectを使用する

私は時系列プロットの特定のセクションをシェーディングしようとしています(リセッションシェーディングに少し似ています- Excelのリセッションシェーディングに関するこの記事 のグラフと同様)。説明するために、少し、おそらく不器用なサンプルをまとめました。最初に時系列を作成し、それをggplot2でプロットしてから、geom_rectを使用してシェーディングを提供します。しかし、私は議論で何か間違っているに違いありません。

a<-rnorm(300)
a_ts<-ts(a, start=c(1910, 1), frequency=12)
a_time<-time(a_ts)
a_series<-ts.union(big=a_ts, month=a_time)
a_series_df<-as.data.frame(a_series)
ggplot(a_series)+
  geom_line(mapping=aes_string(x="month", y="big"))+
  geom_rect(
    fill="red",alpha=0.5, 
    mapping=aes_string(x="month", y="big"), 
    xmin=as.numeric(as.Date(c("1924-01-01"))),
    xmax=as.numeric(as.Date(c("1928-12-31"))),
    ymin=0,
    ymax=2
    )

私も試しましたが、うまくいかなかったことにも注意してください。

geom_rect(
        fill="red",alpha=0.5, 
        mapping=aes_string(x="month", y="big"), 
        aes(
           xmin=as.numeric(as.Date(c("1924-01-01"))),
           xmax=as.numeric(as.Date(c("1928-12-31"))),
           ymin=0,
           ymax=2)
        )

enter image description here

20
toksing

コードは正常に機能し、10進数の日付への変換がxminおよびxmaxに必要です。以下を参照してくださいlubridateパッケージが必要です。

library("lubridate")
library("ggplot2")

ggplot(a_series_df)+
  geom_line(mapping = aes_string(x = "month", y = "big")) +
  geom_rect(
    fill = "red", alpha = 0.5, 
    mapping = aes_string(x = "month", y = "big"), 
    xmin = decimal_date(as.Date(c("1924-01-01"))),
    xmax = decimal_date(as.Date(c("1928-12-31"))),
    ymin = 0,
    ymax = 2
  )

よりクリーンなバージョン、シェーディングが最初にプロットされるため、線の色が変化しません。

ggplot() +
  geom_rect(data = data.frame(xmin = decimal_date(as.Date(c("1924-01-01"))),
                              xmax = decimal_date(as.Date(c("1928-12-31"))),
                              ymin = -Inf,
                              ymax = Inf),
            aes(xmin = xmin, xmax = xmax, ymin = ymin, ymax = ymax),
            fill = "grey", alpha = 0.5) +
  geom_line(data = a_series_df,aes(month, big), colour = "blue") +
  theme_classic()

enter image description here

11
zx8754

annotateを使用すると少し簡単になります。また、次のように長方形の境界を指定できることにも注意してください。

ggplot(a_series_df, aes(month, big)) + 
    geom_line() +
    annotate("rect", fill = "red", alpha = 0.5, 
        xmin = 1924, xmax = 1928 + 11/12,
        ymin = -Inf, ymax = Inf) +
    xlab("time")

これも機能します:

library(Zoo)

z <- read.Zoo(a_series_df, index = 2)
autoplot(z) + 
    annotate("rect", fill = "red", alpha = 0.5, 
        xmin = 1924, xmax = 1928 + 11/12,
        ymin = -Inf, ymax = Inf) + 
    xlab("time") +
    ylab("big")

どちらかがこれを与えます:

enter image description here

13
G. Grothendieck

geom_rectを使用するには、data.frameを使用して長方形の座標を定義する必要があります。

shade = data.frame(x1=c(1918,1930), x2=c(1921,1932), y1=c(-3,-3), y2=c(4,4))

#    x1   x2 y1 y2
#1 1918 1921 -3  4
#2 1930 1932 -3  4

次に、ggplotにデータとシェードdata.frameを指定します。

ggplot() + 
  geom_line(aes(x=month, y=big), color='red',data=a_series_df)+
  geom_rect(data=shade, 
            mapping=aes(xmin=x1, xmax=x2, ymin=y1, ymax=y2), color='grey', alpha=0.2)

enter image description here

9
Colonel Beauvel

これは、ggtsパッケージのgeom_cycle()を使用して簡単に行うことができます。

0
simar
library(xts)
library(Zoo)
library(ggts)

Xtsオブジェクトの作成

data<-as.xts(x=runif(228,20,40),order.by = seq(as.Date("2000/01/01"), by = "month", length.out = 228))

木枠を作りたい日付のデータフレームを作成する

date<-data.frame(as.Date("2008-01-01"),as.Date("2009-01-01"))

陰影のある領域でプロットを作成します

plot_data<-ggts(data)+geom_cycle(date)
0
simar