ggplot2基于时间序列R中的因子放置矩形或平铺
我有一个线条图,我想在背景中覆盖一个矩形或彩色带,基于某列是否为1 以下是一个例子: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 =
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
,就可以了摆脱边界。如果您将此添加到解决方案中,我可以接受不完全重复,但可能有帮助不完全重复,但可能有帮助