2016-07-22 97 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