我想为使用ggplot2
生成的直方图的背景着色。我希望背景为look like the one in the answer here。
这是我的代码:
dates <- seq(from = as.Date("2015/1/1"), to = as.Date("2015/12/31"), "day")
library(lubridate)
day <- yday(dates)
month <- month(dates)
df <- data.frame(day, month)
library(dplyr)
df %>%
sample_n(50) ->
df
library(ggplot2)
ggplot(df, aes(day)) + geom_histogram() +
scale_x_continuous(breaks = seq(0, 365, 10), limits = c(0, 365)) +
theme_bw()
产生这个情节:
这就是我尝试过的,但这不起作用:
ggplot(df, aes(day)) + geom_histogram() +
geom_rect(xmin = day, xmax = day, ymin = -Inf, ymax = Inf, fill = month) +
scale_x_continuous(breaks = seq(0, 365, 10), limits = c(0, 365)) +
theme_bw()
答案 0 :(得分:2)
您尝试绘制采样数据中的矩形,但由于数据丢失,因此无法工作。要绘制矩形,您需要指定每个月的开始和结束日期,最好通过为此目的创建额外的数据集来实现。
这个数据框,我创建如下:
library(dplyr)
month_df <- df %>%
group_by(month) %>%
summarize(start=min(day),end=max(day) + 1) %>%
mutate(month=as.factor(month))
# correct the last day of the year
month_df[12,"end"] <- month_df[12,"end"] - 1
在之前执行此操作非常重要将50个样本替换为df
。最后一行有点不愉快:为了避免矩形之间的间隙,我在一个月的最后一天添加一个。这不应该在最后一天完成。它有效,但也许你找到一个更整洁的解决方案......
month_df
的前几行应为
month start end
1 1 1 32
2 2 32 60
3 3 60 91
现在,可以通过
创建绘图ggplot(df) +
geom_rect(data=month_df,aes(xmin = start, xmax = end, fill = month),
ymin = -Inf, ymax = Inf) +
geom_histogram(aes(day)) +
scale_x_continuous(breaks = seq(0, 365, 10), limits = c(0, 365)) +
theme_bw()
一些评论:
* geom_rect()
必须在geom_histogram()
之前,以便在背景中使用矩形。
*我已将aes(day)
从ggplot()
移至geom_histogram()
,因为它仅在此处使用。否则,它会混淆geom_rect()
,您将收到错误消息。
* ymin=-Inf
和ymax=Inf
不是来自数据的aestetic映射,因为它们实际上设置为常量。所以没有必要在aes()
内有这些。如果你将它们留在aes()
内,那么不会发生任何不好的事情。
我得到的情节如下: