GGR中的二次y轴绘图?

GGR中的二次y轴绘图?,r,ggplot2,plot,tidyverse,yaxis,R,Ggplot2,Plot,Tidyverse,Yaxis,检查了这里提出的一些次轴解决方案,但没有得到正确的结果。我试图在左侧y轴上绘制高程,在右侧y轴上绘制FlowA和Flowb。我的示例代码将进行高程绘图,但是,在次轴上努力获取FlowA和FlowB变量。任何帮助都将不胜感激 library(lubridate) library(tidyverse) set.seed(123) FakeData <- data.frame(Date = seq(as.Date("2001-01-01"), to= as.Date(&q

检查了这里提出的一些
次轴
解决方案,但没有得到正确的结果。我试图在左侧
y轴上绘制
高程
,在右侧
y轴上绘制
FlowA和Flowb
。我的示例代码将进行
高程
绘图
,但是,在
次轴
上努力获取
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()
库(lubridate)
图书馆(tidyverse)
种子集(123)
FakeData中的解决方案对我来说很好。但是我想添加一些调整,因为代码对于您的数据会略有不同。根据该解决方案,我们将使用3个geom对象来表示高程、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轴(
scale\u y\u continuous()
请注意,情节没有那么有意义。您无法清楚地看到流是如何随时间变化的。下面是它在对数刻度中的显示:
我在左y轴上使用对数刻度,在右y轴上使用规则刻度。现在我们可以清楚地看到流量随时间的变化。高程肯定是一条直线,因为您将其设置为随机均匀分布


但是,就个人而言,我不建议您使用双y轴,因为它会混淆绘图用户。我建议您将绘图分成两个不同的绘图。

我建议下一种方法。还要提到的是,输出将取决于您的数据。这里所有的
标高
值都接近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'))
库(lubridate)
图书馆(tidyverse)
种子集(123)
#资料

FakeData非常喜欢您的解决方案-非常感谢。只有一个问题。在我的实际数据中,我有一个
变量
,它有一些缺少的数据
(即NA)
——当使用
缩放y连续(秒轴=秒轴(~./scalefactor,name='流a和流B'))
。具有
NA
变量
将不会获得
重新缩放
。是否有解决此问题的方法?@Hydro根据您拥有的
NA
数量,您可以对缺失数据进行插补以填充这些值,也可以使用样条线方法来完成这些值。我希望这能对你有所帮助:)@Hydro如果你有
NA
请将其用于比例因子
scalefactor非常感谢@Mathew,你的解决方案有一些优点-但不是我想要的。以这种方式使用
geom_col()
也有危险,因为它默认为
position=“stack”
,它在对数尺度上对数据进行了扭曲反映。