使用geom_rect和geom_histogram

时间:2015-07-20 09:05:55

标签: r ggplot2 data-visualization

我想为使用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()

产生这个情节:

enter image description here

这就是我尝试过的,但这不起作用:

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()

1 个答案:

答案 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=-Infymax=Inf不是来自数据的aestetic映射,因为它们实际上设置为常量。所以没有必要在aes()内有这些。如果你将它们留在aes()内,那么不会发生任何不好的事情。

我得到的情节如下:

enter image description here