ggplot次要网格线与(禁用的)主要网格线重合时未显示

时间:2019-08-16 21:17:29

标签: r date ggplot2 gridlines

我创建了一个图表,用x轴按年份中的日期绘制数据,其中的刻度线表示每个月的开始,而较小的网格线表示每周的开始。

我故意不在x轴上显示主要的网格线,这会使图表过于繁忙。但是,这会产生意想不到的效果:次要网格线与(禁用的)主要网格线重合时不会显示。 (也就是说,只要每月的第一天是星期一,分别是2018年1月1日和10月1日。)

这可能是一个错误,是否有解决此问题的方法?

library(tidyverse)
library(lubridate)

dat = tibble(
  date = as_date(c("2018-01-01", "2019-01-01")),
  proportion = c(.2, .8)
)

dat %>% 
  ggplot(aes(x = date, y = proportion)) +
  geom_point() +
  scale_x_date(breaks = "1 month", minor_breaks = "1 week", date_labels = "%b") +
  scale_y_continuous(limits = c(0, 1)) +
  theme(
    panel.grid.major.x = element_blank(),
    panel.grid.minor.y = element_blank()
  )

graph

1 个答案:

答案 0 :(得分:1)

实际上,这是 预期 的行为。请参阅GitHub上此版本(确实很旧)issue下的讨论,这导致ggplot2:::guide_grid(一个未导出的函数,在打印ggplot对象之前操纵网格线)仅保留不重叠的较小网格线主要的:

> ggplot2:::guide_grid
function (theme, x.minor, x.major, y.minor, y.major) {
  x.minor <- setdiff(x.minor, x.major)
  y.minor <- setdiff(y.minor, y.major)
  ...
}

解决方法

一种解决此问题的快速而肮脏的方法是预先运行trace(ggplot2:::guide_grid, edit=TRUE),并从弹出窗口的代码中手动删除x.minor <- setdiff(x.minor, x.major)行。

您的代码此后应能按预期工作:

plot

(此效果将在您关闭R会话时结束,或更早的情况(如果您运行untrace(ggplot2:::guide_grid))。