所以我读this post时,我对俄罗斯方块式月间休息的日历热图有点爱上了。

但是,ggplot示例未实现“俄罗斯方块”中断,这可以说是最好的部分。

因此,FTFY,gist here



此过程是:


为您的数据创建适当的俄罗斯方块休息时间
left_join您的数据到(1)中创建的俄罗斯方块中断
通过一些特制的ggplot通过geom泵送上述内容


(1)的方法相当简单,可以在gistcalendar_tetris_data(...)函数中实现,尽管可以使其灵活一些。

我的问题主要是关于(3):如何将7个geom捆绑在一起以使中断成为单个过程或geom

如果我这样做:

calendar_tetris_geoms <- function() {
  geom_segment(aes(x=x, xend=x, y=ymin, yend=ymax)) +                    # (a)
    geom_segment(aes(x=xmin, xend=xmax, y=y, yend=y)) +                  # (b)
    geom_segment(aes(x=dec.x, xend=dec.x, y=dec.ymin, yend=dec.ymax)) +  # (c)
    geom_segment(aes(x=nye.xmin, xend=nye.xmax, y=nye.y, yend=nye.y)) +  # (d)
    geom_segment(x=-0.5, xend=51.5, y=7.5, yend=7.5) +                   # put a line along the top
    geom_segment(x=0.5, xend=52.5, y=0.5, yend=0.5) +                    # put a line along the bottom
    geom_text(aes(x=month.x, y=month.y, label=month.l), hjust=0.25)      # (e)

}


然后尝试将其添加到我的ggplot中,它不起作用:

> ggplot(data) + calendar_tetris_geoms()
Error in calendar_tetris_geoms() :
  argument "plot" is missing, with no default


我显然不明白这是如何工作的。这是如何运作的?

最佳答案

如果我这样做的话,修改@baptiste的建议:

calendar_tetris_geoms <- function() {
  list(
    geom_segment(aes(x=x, xend=x, y=ymin, yend=ymax)),                 # (a)
    geom_segment(aes(x=xmin, xend=xmax, y=y, yend=y)),                 # (b)
    geom_segment(aes(x=dec.x, xend=dec.x, y=dec.ymin, yend=dec.ymax)), # (c)
    geom_segment(aes(x=nye.xmin, xend=nye.xmax, y=nye.y, yend=nye.y)), # (d)
    geom_segment(x=-0.5, xend=51.5, y=7.5, yend=7.5),                  # put a line along the top
    geom_segment(x=0.5, xend=52.5, y=0.5, yend=0.5),                   # put a line along the bottom
    geom_text(aes(x=month.x, y=month.y, label=month.l), hjust=0.25)    # (e)
  )
}


然后这可以治疗:

calendar_tetris_data(min(stock.data$date), max(stock.data$date)) %>%
  left_join(stock.data) %>%
  ggplot() +
  geom_tile(aes(x=week, y=wday2factor(wday), fill = Adj.Close), colour = "white") +
  calendar_tetris_geoms() +
  facet_wrap(~ year, ncol = 1)

07-24 13:35