R中ggplot中的次要y轴?

Secondary y-axis in ggplot in R?

仔细阅读了此处提出的一些 secondary axis 解决方案,但没有正确解决。我正在尝试在左侧 y-axis 上绘制 Elevation,在右侧 y-axis 上绘制 FlowA & Flowb。我的示例代码将执行 Elevation plotting 但是,努力获取 secondary axis 上的 FlowA & FlowB 变量。任何帮助将不胜感激。

library(lubridate)
library(tidyverse)

set.seed(123)

FakeData <- data.frame(Date = seq(as.Date("2001-01-01"), to= as.Date("2001-12-31"), by="day"),
                 Elevation = runif(365, 806.8,807.8),
                 FlowA = runif(365,8,15),
                 FlowB = runif(365,1,3))
ggplot(FakeData, aes(x = Date, y = Elevation))+
  geom_line()

here 中的解决方案对我来说效果很好。但我想添加一些调整,因为您的数据的代码会略有不同。根据解决方案,我们将使用 3 个几何对象来表示高程、FlowA 和 FlowB。我们还将为 FlowA 和 FlowB 制作辅助轴。

ggplot(FakeData, aes(x = Date))+
  geom_line(aes(y = Elevation)) +
  geom_col(aes(y = FlowA), fill="blue") +
  geom_col(aes(y = FlowB), fill='red')+
  scale_y_log10(sec.axis = sec_axis(~ .*1, labels = scales::number_format(scale=1/10),name="Flow"))

在上面的代码中,我将高程显示为线图,流量显示为条形图。为什么我在这里使用对数刻度?因为海拔的取值范围(806.8到807.8之间)和流量的取值范围相差很远。如果你继续使用常规 y-axis (scale_y_continuous()),你将得到下面的图: 看剧情没那么有意义。您无法清楚地看到流量如何随时间变化。这是它在对数刻度中的样子: 我在左侧 y-axis 使用对数刻度,在右侧 y-axis 使用常规刻度。现在我们可以清楚地看到流量随时间的变化。 Elevation肯定是直线,因为你设置的是随机均匀分布

但是,就我个人而言,我不建议您使用双重 y-axis,因为它会使绘图用户感到困惑。我建议你把情节分成两个不同的情节。

我建议采用下一种方法。还要提到输出将取决于您的数据。这里所有 Elevation 值都接近 800。对于第二个轴,您必须围绕所有变量定义比例因子,以便正确显示它们。接下来的代码:

library(lubridate)
library(tidyverse)

set.seed(123)
#Data
FakeData <- data.frame(Date = seq(as.Date("2001-01-01"), to= as.Date("2001-12-31"), by="day"),
                       Elevation = runif(365, 806.8,807.8),
                       FlowA = runif(365,8,15),
                       FlowB = runif(365,1,3))
#Scale factor
scalefactor <- max(FakeData$Elevation)/max(max(FakeData$FlowA),max(FakeData$FlowB))
#Plot
ggplot(FakeData, aes(x = Date))+
  geom_line(aes(y = Elevation,group=1,color='Elevation'),show.legend = T)+
  geom_line(aes(y = FlowA*scalefactor, color = 'FlowA'))+
  geom_line(aes(y = FlowB*scalefactor, color = 'FlowB'))+
  scale_y_continuous(sec.axis = sec_axis(~./scalefactor, name = 'Flow A and Flow B'))

输出: