我创建了一个图表,用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()
)
答案 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)
行。
您的代码此后应能按预期工作:
(此效果将在您关闭R会话时结束,或更早的情况(如果您运行untrace(ggplot2:::guide_grid)
)。