ggplot2基于时间序列R中的因子放置矩形或平铺

ggplot2基于时间序列R中的因子放置矩形或平铺,r,ggplot2,R,Ggplot2,我有一个线条图,我想在背景中覆盖一个矩形或彩色带,基于某列是否为1 以下是一个例子: df <- data.frame(date = seq.Date(as.Date("2015-01-01"), as.Date("2016-12-01"), by = "month"), value = c(rep(NA, 5), rep(1, 2), rep(NA, 3), rep(1, 10), rep(NA, 4))) df2 <- data.frame(date =

我有一个线条图,我想在背景中覆盖一个矩形或彩色带,基于某列是否为1

以下是一个例子:

df <- data.frame(date = seq.Date(as.Date("2015-01-01"), as.Date("2016-12-01"), by = "month"),
           value = c(rep(NA, 5), rep(1, 2), rep(NA, 3), rep(1, 10), rep(NA, 4)))

df2 <- data.frame(date = seq.Date(as.Date("2015-01-01"), as.Date("2016-12-01"), by = "month"),
                 values = c(rep(1, 10), rep(2, 10), rep(3, 4)))
我只想绘制线条图,然后在
df$value
1
的地方将背景涂成灰色


从Melissa的解决方案中,我很接近,但得到了奇怪的结论:


您需要稍微玩一下,但这会让您得到您想要的大部分:

df3 <- left_join(df2, df)


ggplot(df3, aes(x = date, y = values)) + 
  geom_line() + 
  geom_tile(aes(x = date, fill = !is.na(value)), width = 30, height = .4, alpha = 0.5, color = NA) + 
  scale_fill_manual(values = c("gray20", NA))

此时宽度不太正确-您可以尝试切换到
geom\u rect
,以通过左右点而不是中间点来定义宽度(请参阅
geom_\u rect
geom_tile
的说明,以了解零件的具体情况。

您需要对其进行一点操作,但这应该可以满足您的大部分需求:

df3 <- left_join(df2, df)


ggplot(df3, aes(x = date, y = values)) + 
  geom_line() + 
  geom_tile(aes(x = date, fill = !is.na(value)), width = 30, height = .4, alpha = 0.5, color = NA) + 
  scale_fill_manual(values = c("gray20", NA))

此时宽度不太正确-您可以尝试切换到
geom\u rect
,以通过左右点而不是中间点来定义宽度(请参阅
geom_-rect
geom_-tile
的说明,以了解零件的详细信息。

这里有一个关于
geom_-rect
的答案,这是该应用程序的另一个选择。
ggplot
对于在
geom
规范中对数据进行子集设置非常宽容,因此类似的内容可能适用于您的si行动:

df <- data.frame(date = seq.Date(as.Date("2015-01-01"), as.Date("2016-12-01"), by = "month"),
             value = c(rep(1, 6), rep(NA, 4), rep(1, 10), rep(NA, 4)))
df2 <- data.frame(date = seq.Date(as.Date("2015-01-01"), as.Date("2016-12-01"), by = "month"),
              values = c(rep(1, 10), rep(2, 10), rep(3, 4)))

library(ggplot2)
library(lubridate)
ggplot() + 
  geom_rect(data=subset(df,value==1), aes(xmin=date, xmax=date+months(1), ymin=-Inf, ymax=Inf), fill="light grey", colour=NA) +
  geom_line(data=df2, aes(x = date, y = values)) +
  theme_classic()

df这里是一个关于
geom_rect
的答案,这是该应用程序的另一个选择。
ggplot
对于在
geom
规范中对数据进行子集设置非常宽容,因此类似的方法可能适用于您的情况:

df <- data.frame(date = seq.Date(as.Date("2015-01-01"), as.Date("2016-12-01"), by = "month"),
             value = c(rep(1, 6), rep(NA, 4), rep(1, 10), rep(NA, 4)))
df2 <- data.frame(date = seq.Date(as.Date("2015-01-01"), as.Date("2016-12-01"), by = "month"),
              values = c(rep(1, 10), rep(2, 10), rep(3, 4)))

library(ggplot2)
library(lubridate)
ggplot() + 
  geom_rect(data=subset(df,value==1), aes(xmin=date, xmax=date+months(1), ymin=-Inf, ymax=Inf), fill="light grey", colour=NA) +
  geom_line(data=df2, aes(x = date, y = values)) +
  theme_classic()

df我认为如果df中有超过1个“组”的1,这将失败。因为它会将它们全部分组,并从最小日期到最大日期形成一个矩形。@jchaykow,很好的观点。编辑代码以适应此示例,使用
lubridate
value==1
的月份进行着色。我认为如果有在df中,我们有1个以上的“组”。因为它会将它们全部组合在一起,并形成一个从最小日期到最大日期的矩形。@jchaykow,观点很好。编辑代码以适应此示例,使用
lubridate
value==1
的月份进行着色。谢谢,这非常接近。我的绘图上下出现了奇怪的线条。我在我的问题中作为编辑发布了一张图片,这些图片可能来自
geom_tile
矩形的边框-你可能需要玩它。我肯定会尝试
geom_-rect
我找到了它。只需在geom_tile调用中设置
color=NA
,它就可以去掉边框。如果你将此添加到你的解决方案中,我可以接受anks,这非常接近。我的情节上下都有奇怪的线条。我在我的问题中发布了一张图片作为编辑。这些图片可能来自
geom_tile
矩形的边界-你可能需要玩它。我肯定会尝试
geom_-rect
我找到了它。只需在geom_tile调用中设置
color=NA
,就可以了摆脱边界。如果您将此添加到解决方案中,我可以接受不完全重复,但可能有帮助不完全重复,但可能有帮助