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”
,它在对数尺度上对数据进行了扭曲反映。