我正在尝试为情节添加背景,以显示24小时内(即夜间,日出,白天,日落)的光照条件。我想用渐变来表示光线过渡期(日出时间上午8点到9点,日落时间下午8点到晚上9点)和白天和黑夜的纯色。
我非常接近,但渐变是垂直方向,我需要水平。
非常感谢任何帮助!
当前工作代码
library(ggplot2)
library(scales)
## date, start and stop time
datestart <- as.POSIXct(strptime('2017-06-20 00:00:00', format = "%Y-%m-%d %H:%M:%S"))
datestop <- as.POSIXct(strptime('2017-06-20 23:59:59', format = "%Y-%m-%d %H:%M:%S"))
## sunrise
risestart <- as.POSIXct(strptime('2017-06-20 08:00:00', format = "%Y-%m-%d %H:%M:%S"))
risestop <- as.POSIXct(strptime('2017-06-20 09:00:00', format = "%Y-%m-%d %H:%M:%S"))
## sunset
setstart <- as.POSIXct(strptime('2017-06-20 20:00:00', format = "%Y-%m-%d %H:%M:%S"))
setstop <- as.POSIXct(strptime('2017-06-20 21:00:00', format = "%Y-%m-%d %H:%M:%S"))
## data limits
lims <- c(datestart, datestop)
## generate some random data
timelist <- seq(datestart, datestop, by = '15 mins')
act <- runif(length(timelist), min = 0, max = 50)
data <- data.frame(timelist, act)
## colours
nightColour <- c("#9ea5ff")
sunriseColour <- c("#9ea5ff", "#fcffbd")
testColour <- c(c("#9ea5ff"), c("#fcffbd"))
dayColour <- c("#fcffbd")
sunsetColour <- c("#fcffbd","#9ea5ff")
## add background
nightGrob <- rasterGrob(nightColour, width = unit(1,"npc"), height = unit(1,"npc"),
interpolate = TRUE)
sunriseGrob <- rasterGrob(sunriseColour, width = unit(1,"npc"), height = unit(1,"npc"),
interpolate = TRUE)
dayGrob <- rasterGrob(dayColour, width = unit(1,"npc"), height = unit(1,"npc"),
interpolate = TRUE)
sunsetGrob <- rasterGrob(sunsetColour, width = unit(1,"npc"), height = unit(1,"npc"),
interpolate = TRUE)
## plot
ggplot(data = data, aes(x = timelist, y = act)) +
annotation_custom(nightGrob, xmin = as.numeric(datestart), xmax = as.numeric(risestart) + 100, ymin = -Inf, ymax = Inf) +
annotation_custom(sunriseGrob, xmin = as.numeric(risestart), xmax = as.numeric(risestop), ymin = -Inf, ymax = Inf) +
annotation_custom(dayGrob, xmin = as.numeric(risestop), xmax = as.numeric(setstart), ymin = -Inf, ymax = Inf) +
annotation_custom(sunsetGrob, xmin = as.numeric(setstart), xmax = as.numeric(setstop), ymin = -Inf, ymax = Inf) +
annotation_custom(nightGrob, xmin = as.numeric(setstop), xmax = as.numeric(datestop), ymin = -Inf, ymax = Inf) +
geom_bar(stat = "identity", colour = "black", fill = "white") +
scale_x_datetime(limits = lims, expand = c(0,0), breaks = date_breaks('1 hour'), labels = date_format(format = "%H", tz = "Europe/London")) +
scale_y_continuous(expand = c(0,0))
答案 0 :(得分:0)
如果您愿意,也可以制作包含大量geom_rect
s而非rasterGrob
的渐变。
这是一个函数,它返回data.frame
渐变背景的绘图数据,您可以使用geom_rect
绘制。
GenerateGradientData <- function(start_hour,
stop_hour,
start_colour,
stop_colour,
x_resolution = 100) {
# define the colour palette
colour_function <- colorRampPalette(
c(start_colour, stop_colour),
alpha = TRUE)
# set up the rect coordinates
x_range <- seq(start_hour,
stop_hour,
length.out = x_resolution + 1)
grad_xmin <- x_range[-length(x_range)]
grad_xmax <- x_range[c(1:x_resolution + 1)]
# define colours
grad_colours <- colour_function(x_resolution)
# return data.frame
data.frame(
xmin = grad_xmin,
xmax = grad_xmax,
ymin = -Inf,
ymax = Inf,
grad_colours = grad_colours
)
}
这是一个使用数字x轴的例子:
# dummy data
set.seed(1)
plot_data <- data.frame(
hours = c(1:24),
value = rnorm(24, 100, 30)
)
# day/night colours
night_colour <- c("#9ea5ff")
day_colour <- c("#fcffbd")
# generate data for a one-hour sunrise gradient
sunrise_pd <- GenerateGradientData(start_hour = 8,
stop_hour = 9,
start_colour = night_colour,
stop_colour = day_colour,
x_resolution = 1000)
# generate data for a one-hour sunset gradient
sunset_pd <- GenerateGradientData(start_hour = 20,
stop_hour = 21,
start_colour = day_colour,
stop_colour = night_colour,
x_resolution = 1000)
# setup plot
ggplot(plot_data, aes(x = hours, y = value)) +
scale_x_continuous(expand = c(0, 0)) +
scale_y_continuous(expand = c(0, 0)) +
# day background
geom_rect(xmin = 9,
xmax = 20,
ymin = -Inf,
ymax = Inf,
fill = day_colour) +
# night background
geom_rect(xmin = -Inf,
xmax = 8,
ymin = -Inf,
ymax = Inf,
fill = night_colour) +
geom_rect(xmin = 21,
xmax = Inf,
ymin = -Inf,
ymax = Inf,
fill = night_colour) +
# gradient backgrounds for sunrise and sunset
geom_rect(data = sunrise_pd,
mapping = aes(xmax = xmax,
xmin = xmin,
ymax = ymax,
ymin = ymin),
fill = sunrise_pd$grad_colours,
inherit.aes = FALSE) +
geom_rect(data = sunset_pd,
mapping = aes(xmax = xmax,
xmin = xmin,
ymax = ymax,
ymin = ymin),
fill = sunset_pd$grad_colours,
inherit.aes = FALSE) +
# finally, plot your data on top
geom_col(fill = NA, colour = "black")
这是输出:
根据x_resolution
,您保存的图形设备和图像查看器,这看起来有点模糊。