2015-08-15 50 views
1

我試圖用包ggplot2多次突出顯示一個時間序列,我創建了一個包含所有高亮的開始日期(xmin)和結束日期(xmax)的data.frame,但我發現了:錯誤: 美學必須是長度的一個或相同的長度dataProblems:XMIN,XMAX,YMIN,YMAX在時間序列上的多個geom_rect

的代碼是:

g.bottom <- ggplot(,aes(x =decimal_date(date), y =C$PE)) + 
geom_rect(data=s,aes(xmin=decimal_date(xmin), xmax=decimal_date(xmax),ymin=ymin,ymax=ymax), 
alpha=0.1, color="pink", fill="pink")+ 
geom_line() + 
theme_classic() + 
theme(plot.margin = unit(c(0,5,10,4),units="points"))+ 
labs(x="Fecha",y = "PE") 

這是數據S :

xmin<-c("2011/07/28","2012/04/09","2012/04/16","2013/04/22","2014/12/08","2014/12/15","2014/12/18") 
xmax<-c("2011/08/08","2012/04/12","2012/06/12","2013/04/26","2014/12/11","2014/12/16","2015/04/09") 
ymin<- c(-Inf,-Inf,-Inf,-Inf,-Inf,-Inf,-Inf) 
ymax<-c(Inf,Inf,Inf,Inf,Inf,Inf,Inf) 
s<- data.frame(xmin,xmax,ymin,ymax) 
transform(s, xmin=as.Date(xmin,format="%Y/%m/%d"))%>% 
transform(xmax=as.Date(xmax,format="%Y/%m/%d"))->s 
s 
     xmin  xmax  ymin ymax 
    1 2011-07-28 2011-08-08 -Inf Inf 
    2 2012-04-09 2012-04-12 -Inf Inf 
    3 2012-04-16 2012-06-12 -Inf Inf 
    4 2013-04-22 2013-04-26 -Inf Inf 
    5 2014-12-08 2014-12-11 -Inf Inf 
    6 2014-12-15 2014-12-16 -Inf Inf 
    7 2014-12-18 2015-04-09 -Inf Inf 

,這是C

 Date  GSADF PE 
1 26/01/2011 0.7990547 29.07 
2 27/01/2011 0.7970526 29.20 
3 28/01/2011 0.7947446 28.66 
4 31/01/2011 0.7950117 29.05 
5 01/02/2011 0.7931063 29.72 
6 02/02/2011 0.7900929 29.92 
+0

你能提供你的數據,C呢? – jazzurro

+0

一旦所有的數據都是正確的類型,你的代碼就可以正常工作。你確定xmin和xmax的格式是否正確?庫(lubridate); s $ xmin < - ymd(s $ xmin); s $ xmax < - ymd(s $ xmax)' – scoa

+0

我頭C爲你@jazzurro,也做了什麼SCOA建議芽不工作,我得到相同的錯誤 –

回答

0

這裏是給你一個方法。我認爲關鍵是使用decimal_date()。您可以在編寫ggplot代碼之前使用該函數並安排數據框。在這裏,我在ggplot的其中一行中使用了該函數。我希望這能幫到您。

library(lubridate) 
library(magrittr) 
library(ggplot2) 

mydf <- read.table(text = "  Date  GSADF PE 
1 26/01/2011 0.7990547 29.07 
2 27/01/2011 0.7970526 29.20 
3 28/01/2011 0.7947446 28.66 
4 31/01/2011 0.7950117 29.05 
5 01/02/2011 0.7931063 29.72 
6 02/02/2011 0.7900929 29.92", header = T) 

### Convert factor to date 
transform(mydf, Date = as.Date(Date, format = "%d/%m/%Y")) -> mydf 

mydf2 <- read.table(text = "  xmin  xmax  ymin ymax 
1 2011-07-28 2011-08-08 -Inf Inf 
2 2012-04-09 2012-04-12 -Inf Inf 
3 2012-04-16 2012-06-12 -Inf Inf 
4 2013-04-22 2013-04-26 -Inf Inf 
5 2014-12-08 2014-12-11 -Inf Inf 
6 2014-12-15 2014-12-16 -Inf Inf 
7 2014-12-18 2015-04-09 -Inf Inf", header = T) 

### Convert factor to date 
transform(mydf2, xmin = as.Date(xmin, format = "%Y-%m-%d")) %>% 
transform(xmax = as.Date(xmax, format = "%Y-%m-%d")) -> mydf2 


### Decial dates are necessary. Use decimal_date() in the lubridate package. 

ggplot() + 
geom_rect(data = mydf2, aes(xmin = decimal_date(xmin), xmax = decimal_date(xmax), ymin = ymin, ymax = ymax), 
     alpha = 0.1, color = "pink", fill = "pink") + 
geom_line(data = mydf, aes(x = decimal_date(Date), y = PE)) 

enter image description here

+0

謝謝@jazzurro但它不工作,我我將在問題中添加突出顯示日期的日期框架,因爲它是唯一可能出錯的東西 –

+0

@alejandroandrade感謝您的支持。當你更新你的問題時讓我知道。 – jazzurro

+0

我用你的建議更新我的評論,我不知道你是否想要我也包括我打開我的數據並將其轉換爲時間序列的方式? –