2016-07-22 71 views
1

我有一個數據集隨着時間(日期)有兩個變量(Tb和Ta)。看起來像這樣:根據因子水平的陰影ggplot2背景

`    Date  Tb  Ta Light 
1 2015-02-15 01:13:00 36.103 22.751 nightime 
2 2015-02-15 01:55:00 36.103 22.626 nightime 
3 2015-02-15 02:37:00 35.605 22.626 nightime 
4 2015-02-15 03:19:00 35.605 22.751 nightime 
5 2015-02-15 04:01:00 36.103 23.001 nightime 
6 2015-02-15 04:43:00 35.605 22.876 nightime` 

我想在「Light」因素中爲不同級別的陰影做陰影。所以'Light'中的'nightime'的所有點都會以灰色陰影,而'白天'會變成白色。事情是這樣的:

有沒有辦法讓geom_rect()一個因子水平的工作?我需要所有的點編碼爲帶有灰色背景陰影「被安排到」 ......

我嘗試以下基於Using ggplot2 in R, how do I make the background of a graph different colours in different regions?

ggplot() + geom_rect(data=tbdf, (aes(xmin=Date, 
xmax=Date, ymin=min(Tb), ymax=max(Tb), fill=Light))) + 
    geom_line(data = tbdf, aes(x = Date, y = Tb)) + 
    geom_line(data = tbdf, aes(x = Date, y = Ta), colour='grey') + 
    xlab('Date') + 
    ylab('Temperature (°C)') 

,並將其與傳說爲輕,但仍平時灰色陰影結束:

有什麼建議?

+0

我的意思是'aes(NULL,NULL)'不在你所關注的例子中,看起來很奇怪。我會擺脫這一點。 – Gregor

+0

我沒有嘗試過,並刪除了-0.5和+0.5的X最大和最小它仍然使它全部是一種顏色(Nightime之一)。我編輯了該帖子以將其刪除。 –

+0

如果你想用'dput()','dput(head(tbdf,20))'分享你的數據,那麼複製/粘貼在你的POSIX日期時間裏讀取是一個真正的痛苦。還要確保您顯示足夠的數據,以便它不是全部的夜間。真正的解決方案可能是創建一個摘要數據框架,該框架每天都有過渡點,每天繪製2個矩形,而不是每個數據行的1個矩形。 – Gregor

回答

1

這似乎已經與日期格式的問題。將它從2015-02-15 01:13:00格式更改爲一個數字(例如42050.05)效果很好。下面是我用

ggplot() + geom_rect(data=tbdf, (aes(xmin=Date-0.5, xmax=Date+0.5, 
ymin=min(Ta)-0.5, ymax=max(Tb)+0.5, fill=factor(Light)))) + 
scale_fill_manual(values=c("grey", "white"), guide=FALSE) + 
geom_line(data = tbdf, aes(x = Date, y = Tb), size=0.8) + 
geom_line(data = tbdf, aes(x = Date, y = Ta), colour='grey50', size=0.8) + 
ylab('Temperature (°C)') 

這給了我這個 enter image description here

這很好地清理代碼。

1

由於缺乏樣本數據我創建了一些。

library(ggplot2) 
library(dplyr) 
daytime <- rep(rep(c("day", "night"), each = 12),10) 
df <- data.frame(date = 1:length(daytime), daytime, value = rnorm(length(daytime))) 

> head(df) 
       date daytime value 
1     1  day -0.7016900 
2     2  day -0.5886091 
3     3  day -0.1962264 
4     4  day 1.3621115 
5     5  day -1.5810459 
6     6  day -0.6598885 

然後我確定了每天和每晚的開始和結束。對於示例數據,這不是必要的,但我猜實際數據並不那麼簡單。

period <- case_when(daytime != lead(daytime) & daytime == "day" ~ "endDay", 
       daytime != lead(daytime) & daytime == "night" ~ "endNight", 
       daytime != lag(daytime) & daytime == "day" ~ "beginDay", 
       daytime != lag(daytime) & daytime == "night" ~ "beginNight") 
period[1]    <- "beginDay" 
period[length(period)] <- "endNight" 

二者結合:

rect <- cbind(df,period) 
names(rect)[1] <- "date" 

和創建2個dataframes,一個用於夜間和一個用於與每個週期的對應的x值白天。

rect_night <- na.omit(rect[rect$daytime == "night", ])[ ,-2:-3] 
rect_night <- data.frame(start = rect_night[rect_night$period == "beginNight", 1], 
         end = rect_night[rect_night$period == "endNight", 1]) 

rect_day <- na.omit(rect[rect$daytime == "day", ]) 
rect_day <- data.frame(start = rect_day[rect_day$period == "beginDay", 1], 
         end = rect_day[rect_day$period == "endDay", 1]) 

把所有東西放在一起。

ggplot(alpha = 0.3) + 
    geom_rect(data = rect_night,aes(xmin = start, xmax = end, ymin = -5, ymax = 5), fill = "grey") + 
    geom_rect(data = rect_day,aes(xmin = start, xmax = end, ymin = -5, ymax = 5), fill = "yellow") + 
    geom_line(data = df, aes(x = date, y = value)) 

enter image description here