2015-04-15 12 views
10

Tôi đang cố tô bóng một phần nhất định của một ô chuỗi thời gian (tương tự như đổ bóng suy thoái - tương tự như biểu đồ ở cuối this article on recession shading in excel). Tôi đã đặt một chút, có thể vụng về, mẫu lại với nhau để minh họa. Lần đầu tiên tôi tạo một chuỗi thời gian, vẽ nó bằng ggplot2 và sau đó muốn sử dụng geom_rect để cung cấp bóng. Nhưng tôi phải nhận được một cái gì đó sai trong các đối số.Sử dụng geom_rect để tô màu chuỗi thời gian trong R

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 
    ) 

Lưu ý rằng tôi cũng đã thử cũng không hoạt động.

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

Trả lời

6

Mã hoạt động tốt, chuyển đổi sang ngày thập phân là cần thiết cho xmin và xmax, xem bên dưới, yêu cầu gói lubridate.

require("lubridate") 
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 
) 

Phiên bản sạch hơn, tô bóng được vẽ trước để màu đường không thay đổi.

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),color="blue") + 
    theme_classic() 

enter image description here

+0

Lưu ý rằng điều này làm việc vì 'aes() 'được chuyển trực tiếp đến từng Geom, và không cho' ggplot() '. Wierdness xảy ra sau đó nếu bạn cung cấp 'aes (x = Date, ...)' cho 'ggplot()' và sử dụng 'geom_rect()' với bất kỳ địa lý nào khác ... – Jthorpe

+0

@ Jthorpe nó là về thứ tự âm mưu, tôi có thể đặt aes bên trong ggplot và dòng âm mưu sau đó rect, nhưng sau đó dòng sẽ được đằng sau rect. Tất nhiên chúng ta có thể sử dụng alpha. Sở thích. – zx8754

+1

Ok là cụ thể, Nếu bạn cung cấp 'aes()' cho 'ggplot()', bạn sẽ cần phải cung cấp tất cả các biến trong lời gọi đó tới 'aes()' trong dữ liệu được truyền đến 'geom_rect()' và các lớp của các trường sẽ phải nhất quán. Dễ dàng hơn nhiều trong việc chuyển cuộc gọi sang 'aes()' thành các địa lý riêng lẻ hơn là xây dựng các biến bắt buộc với các định dạng đúng trong khung dữ liệu được chuyển tới 'geom_rect()'. – Jthorpe

4

Để sử dụng geom_rect bạn cần xác định hình chữ nhật của bạn phối hợp thông qua một 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 

Sau đó, bạn cho ggplot dữ liệu của bạn và bóng râm 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

của nó dễ dàng hơn một chút bằng annotate và cũng lưu ý rằng các giới hạn cho rectange có thể được quy định như:

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") 

này cũng sẽ làm việc:

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") 

Hoặc một cho này :

enter image description here

Các vấn đề liên quan