从具有辅助y轴的ggplot图表中的geom_line转换时未绘制Geom_area

egdjgwm8  于 2023-04-03  发布在  其他
关注(0)|答案(1)|浏览(146)

我试图在第二个y轴上显示潮汐高度为geom_area,但到目前为止还没有成功。
以下是我目前拥有的代码/图表:

#Creating pH Time series plots both sites
ggplot(data = RB_EOS,
       aes(
         x = Time,
         y = pH_corrected_average,
         color = Site,
         group = Site
       )) +
  geom_line() +
  geom_line(aes(y = 7.55 + Tidal_Depth_ft * 0.075),
            linetype = "dotdash") +
  scale_y_continuous(
    name = "pH",
    limits = c(7.55, 7.85),
    breaks = seq(7.55, 7.85, 0.05),
    sec.axis = sec_axis( ~ (. - 7.55) / 0.075,
                         name = "Tidal Height (ft)",
                         breaks = seq(0, 4, 1))
  ) +
  geom_point() +
  #geom_point(aes(y = 7.55 + Tidal_Depth_ft*0.075)) +
  facet_wrap(~ Week, nrow = 3) +
  theme_bw(base_size = 13) +
  theme(legend.position = "top") +
  ggtitle("pH Tidal Trends") +
  labs(subtitle = "Summer 2022") +
  xlab("Time (PST)") +
  ylab("pH") +
  scale_x_discrete(guide = guide_axis(angle = 90))

plot for code above
这是我创建的pH值线图(y)随着时间的推移(x),然后我输入了一个第二y轴来显示潮汐高度。我能够显示潮汐高度的一条线(没有点),我把它改成了一个点划线-这样做是为了显示潮汐高度与其各自地点的pH值的对应关系,但我无法将geom_area函数适当地应用于潮汐高度的第二y轴,以显示平滑潮汐面积曲线上潮汐周期的值。
我试了这个代码,什么都没发生:

#Creating pH Time series plots both sites
ggplot(data = RB_EOS,
       aes(
         x = Time,
         color = Site,
         group = Site
       )) +
  geom_line(aes(y = pH_corrected_average)) +
  geom_area(aes(y = 7.55 + Tidal_Depth_ft * 0.075)) +
  scale_y_continuous(
    name = "pH",
    limits = c(7.55, 7.85),
    breaks = seq(7.55, 7.85, 0.05),
    sec.axis = sec_axis( ~ (. - 7.55) / 0.075,
                         name = "Tidal Height (ft)",
                         breaks = seq(0, 4, 1))
  ) +
  geom_point(aes(y = pH_corrected_average)) +
  #geom_point(aes(y = 7.55 + Tidal_Depth_ft*0.075)) +
  facet_wrap(~ Week, nrow = 3) +
  theme_bw(base_size = 13) +
  theme(legend.position = "top") +
  ggtitle("pH Tidal Trends") +
  labs(subtitle = "Summer 2022") +
  xlab("Time (PST)") +
  ylab("pH") +
  scale_x_discrete(guide = guide_axis(angle = 90))

2nd plot for code above
正如你所看到的,它没有出来的方式,我的期望,任何帮助表示感谢。谢谢!

mccptt67

mccptt671#

由于scale_y_continuous()设置的限制,您的区域几何体没有绘制在图上。我敢打赌,如果您注解掉scale_y_continuous(...),您将看到绘制的geom_area()。您可以告诉这是情况,因为OP为区域几何体正确绘制了图例,但只是没有看到它绘制在图上。
解决方案是使用coord_cartesian(...)而不是scale_y_continuous(...)
原因是,当您在scale_y_continuous()中设置limits=参数时,它会导致超出这些限制的数据不包括在绘图上绘制的任何内容中。虽然这对于geom_line()来说很好,但geom_area()的工作方式略有不同。geom_area()绘制的区域需要上限(你的线)和下限(y=0)被包括在区域中,否则它不会被绘制。这里有一个例子。

问题示例

下面是一个示例plot代码:

set.seed(8675309)
df <- data.frame(
  x=rep(1:100, 2),
  y=c(sample(45:50, 100, replace=T), sample(30:35, 100, replace=T)),
  y1=c(sample(10:13, 100, replace=T), sample(3:7, 100, replace=T)),
  category=rep(c("A", "B"), each=100))

plot <-
ggplot(df, aes(x=x, y=y, color=category, fill=category)) + theme_bw() +
  geom_line() +
  geom_area(aes(y=y1), linetype=2, alpha=0.2)

给你这个:

如果我们将y轴上的限制设置为大于0,那么“较低”区域geom就会消失。请注意,ylim(5,50)实际上只是scale_y_continuous(limits=c(5,50))的 Package 器:

plot + ylim(5,50)

请注意,“上部”区域geom仍然存在(红色区域)。这是因为该区域绘制的所有下限值都高于我们设置的下限5。如果我们增加限制,以便排除红色区域中的下限点,则整个geom消失:

plot + ylim(8,50)

重要的是,请注意就像OP的情况一样,图例仍然绘制。这是“吸烟枪”,表明geom_area命令没有任何错误-它设置了限制。

修复

解决这个问题的方法是使用coord_cartesian(...)而不是scale_y_continuous(...)。与ylim()不同,coord_cartesian()会改变绘图区域中显示的内容 *,但不会删除任何超出这些限制的点 *。实际上,它们仍然是“绘制”的,但图只是放大到所指出的区域。ylim()scale_*_(limits=...)函数实际上删除了指示限制之外的数据点。
因此,当我们执行以下操作时,您仍然可以看到绘制的每个几何体(甚至底部区域几何体的“尖端”):

我很确定这就是OP的问题所在。你可以使用coord_cartesian(sec_axis=...)来设置辅助y轴。

相关问题