我还没有发现任何有关此问题的历史问题...我想突出显示ggplot图表的周末表现,以便用户可以直接告诉图表哪一部分(可能是灰色阴影?)是周末表演。
这是测试数据的简单版本:
test <- data.frame(DATE=seq(from = as.POSIXct("2014-07-16 01:00"), to = as.POSIXct("2014-07-30 00:00"), by = "hour"),count=floor(runif(336,1,100)))
我的图表的简单版本是:
ggplot() + geom_line(aes(x=DATE,y=count),data=test) + labs(title="test")
所以结果可能就像下面的东西......
答案 0 :(得分:6)
使用geom_area()更简洁,适用于任何日期范围。
library(ggplot2)
test <- data.frame(DATE=seq(from = as.POSIXct("2014-07-16 01:00"),
to = as.POSIXct("2014-07-30 00:00"),
by = "hour"),
count=floor(runif(336,1,100)))
test$weekend <- weekdays(test$DATE) %in% c("Saturday", "Sunday")
ggplot(data=test, aes(x=DATE, y=count)) +
geom_area(aes(y=weekend*max(count)), fill="yellow") +
geom_line() +
labs(title="test")
答案 1 :(得分:5)
此处的代码可以在您的数据中执行两个周末。您可以通过添加更多geom_rect()调用(或调用一个循环)来推广到任意数量的周末。
# your data
test <- data.frame(DATE=seq(from = as.POSIXct("2014-07-16 01:00"), to = as.POSIXct("2014-07-30 00:00"), by = "hour"),count=floor(runif(336,1,100)))
your_plot <- ggplot(test) + geom_line(aes(x=DATE,y=count)) + labs(title="test")
# get all the start and end points
library(lubridate) # for hour function
sats <- which(hour(test$DATE)==0 & weekdays(test$DATE)=='Saturday')
suns <- which(hour(test$DATE)==23 & weekdays(test$DATE)=='Sunday')
# do your plot plus weekend highlights
your_plot +
geom_rect(aes(xmin=DATE[sats[1]], xmax=DATE[suns[1]],
ymin=min(count), ymax=max(count)),
fill='yellow', alpha=.005) +
geom_rect(aes(xmin=DATE[sats[2]], xmax=DATE[suns[2]],
ymin=min(count), ymax=max(count)),
fill='yellow', alpha=.005)
答案 2 :(得分:2)
这是使用 Tydiverse工具,更确切地说是geom_tile
的一种方法。优点是您不必精确定义x
的边界。
library(dplyr)
library(lubridate)
library(ggplot2)
test %>%
# My preference :-)
rename_all(tolower) %>%
# Computing the weekends by converting in weekday starting on monday to ease the cut
mutate(weekend = wday(date, week_start = getOption("lubridate.week.start", 1)) > 5) %>%
ggplot() +
geom_line(aes(x = date, y = count)) +
# And here is the trick!
scale_fill_manual(values = c("alpha", "yellow")) +
geom_tile(aes(
x = date,
y = min(count),
height = Inf,
fill = weekend
), alpha = .4)
注意:我已经针对该主题写了更详细的post。
答案 3 :(得分:1)
根据我的评论,希望这就是你要找的东西:
test <- data.frame(DATE=seq(from = as.POSIXct("2014-07-16 01:00"), to = as.POSIXct("2014-07-30 00:00"), by = "hour"),count=floor(runif(336,1,100)))
ggplot() + geom_rect(aes(xmin = as.POSIXct("2014-07-26 00:00"), xmax = as.POSIXct("2014-07-28 00:00"), ymin = 0, ymax = 100), fill = "yellow")+
geom_line(aes(x=DATE,y=count),data=test) + labs(title="test")
在问题中给出几乎完全相同的图像。您可以更改填充以更改颜色,并在需要时在不同点轻松添加其他矩形。
答案 4 :(得分:1)
我找到了一个很好的解决方案geom_bar()
,你可以在周末制作一个无限的矢量,剩下的值是NA,不会被绘制。我使用lubridate
,因为我对它更熟悉。我还必须在第一次调用ggplot()
时命名美学,所以轴继承了它们的专有名称,y
没有被标记为“周末”:
library(lubridate)
library(ggplot2)
test <- data.frame(DATE=seq(from = as.POSIXct("2014-07-16 01:00"), to = as.POSIXct("2014-07-30 00:00"), by = "hour"),count=floor(runif(336,1,100)))
your_plot <- ggplot(test) + geom_line(aes(x=DATE,y=count)) + labs(title="test")
your_plot
test$wd <- wday(test$DATE, label = TRUE)
test$weekend[test$wd=="Sat" | test$wd=="Sun"] <- 1/0
highlight_plot <- ggplot(test, aes(x= DATE, y = weekend)) +
geom_bar(stat="Identity", aes(y=weekend), col="yellow", alpha=.4, width = 1) +
geom_line(aes(x=DATE,y=count)) + labs(title="test")
highlight_plot
这个解决方案非常灵活,很容易调整方法以突出显示不同的日期向量。