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'))
输出:
仔细阅读了此处提出的一些 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,因为它会使绘图用户感到困惑。我建议你把情节分成两个不同的情节。
我建议采用下一种方法。还要提到输出将取决于您的数据。这里所有 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'))
输出: