在双 y 轴 ggplot 中调整 y 轴限制

Adjust y axis limits in dual y axis ggplot

我正在尝试生成一个图形,将 geom_line 覆盖在 geom_bar 上,其中 x 轴的比例不同(每周与每天)。我能够绘制我想要的东西,但不能在不干扰辅助轴的 1 到 1 转换的情况下将 Temp y 轴调整为具有 24-30 的限制。下面是数据帧的 2 个非常小的子集和一个示例图。我希望 Degree Heating Weeks 轴保持不变,但将 Temp 轴调整为 24-30。

    a <- structure(list(Date = structure(c(18116, 18117, 18118, 18119, 18120, 18121, 18122, 
    18123, 18124, 18125, 18126, 18127, 18128, 18129, 18130, 18131, 18132, 18133, 18134, 18135, 
    18136), class = "Date"), Temp2019 = c(29.0416666666667, 29.1375, 29.4125, 29.3833333333333, 
    29.575, 29.5541666666667, 29.2458333333333, 29.2416666666667, 29.0666666666667, 
    29.0541666666667, 28.9833333333333, 29.0625, 28.9958333333333, 29.1, 28.9625, 
    29.0041666666667, 29.0791666666667, 28.9, 28.675, 28.4916666666667, 28.5625), Max2019 = 
    c(29.3, 29.5, 29.6, 29.6, 29.8, 29.9, 29.6, 29.6, 29.3, 29.3, 29.3, 29.4, 29.4, 29.4, 29.2, 
    29.3, 29.6, 29.2, 29, 28.7, 28.9), Min2019 = c(28.3, 28.5, 29, 29, 29.1, 29.1, 28.8, 28.8, 
    28.8, 28.8, 28.6, 28.6, 28.7, 28.7, 28.6, 28.6, 28.4, 28.4, 28.2, 28.1, 28.1)), row.names = 
    100:120, class = "data.frame")

    b <- structure(list(Week = c("32", "33", "34"), DHW = c(3.05952380952381, 3.20833333333333, 
    3.26785714285714), Date = structure(c(18120, 18127, 18134), class = "Date")), row.names = 
    15:17, class = "data.frame")

    ggplot() + 
        geom_ribbon(a, mapping = aes(x = Date, ymin = Min2019, ymax = Max2019), alpha = 0.2, linetype = "blank", color = "black", fill = "black") + 
        geom_line(a, mapping = aes(Date, Temp2019), color = "black") + 
        geom_bar(b, mapping = aes(Date, DHW*6, fill = DHW), stat = "identity") +
        scale_y_continuous(sec.axis = sec_axis(~./6, name = "Degree Heating Weeks")) +
        scale_fill_gradient(high = "#DD6666", low = "#F8E1E1") + 
        scale_x_date(date_breaks = "1 week") + 
        labs(y = "Temp (°C)")

我认为这里的挑战是 geom_bar/geom_col 的基线为零,所以我不知道如何使用 y 轴范围内不包含 0 的几何对象。因此,您可以在其位置使用 geom_tile,指定中心 y 点和高度。

原文供参考:

作为第一步,我们可以测试 geom_tile 的使用,其中两个轴使用相同的垂直距离作为 1 个单位。为此,我们将条形数据向上移动 24(因此其基线为 24),并将标签向下移动 24(这样主轴上的 24 在次轴上显示为 0)。对于 geom_tile,我们将 y 定义为 DHW/2 + 24,因为我们需要图块的中间高度。

ggplot() + 
  geom_tile(data = b, aes(Date, DHW/2 + 24, width = 7*0.9, height = DHW, fill = DHW)) +
  geom_ribbon(data = a, aes(x = Date, ymin = Min2019, ymax = Max2019), 
              alpha = 0.2, linetype = "blank", color = "black", fill = "black") + 
  geom_line(data = a, aes(Date, Temp2019), color = "black") + 
  scale_y_continuous(sec.axis = sec_axis(~.-24, name = "Degree Heating Weeks")) +
  scale_fill_gradient(high = "#DD6666", low = "#F8E1E1") + 
  scale_x_date(date_breaks = "1 week") + labs(y = "Temp (°C)")

如果我们想拉伸条形以占据更多 space,比如每度供暖周 1.5 dec C,我们将该比例添加到数据和比例转换中,方向相反。

ggplot() + 
  geom_tile(data = b, aes(Date, DHW/2*1.5 + 24, width = 7*0.9, height = DHW*1.5, fill = DHW)) +
  geom_ribbon(data = a, aes(x = Date, ymin = Min2019, ymax = Max2019), 
              alpha = 0.2, linetype = "blank", color = "black", fill = "black") + 
  geom_line(data = a, aes(Date, Temp2019), color = "black") + 
  scale_y_continuous(sec.axis = sec_axis(~(.-24)/1.5, name = "Degree Heating Weeks")) +
  scale_fill_gradient(high = "#DD6666", low = "#F8E1E1") + 
  scale_x_date(date_breaks = "1 week") + labs(y = "Temp (°C)")

调味。