R语言如何画双Y轴图

引言
在数据分析和可视化过程中,往往需要绘制多个变量的趋势图,其中一些变量可能具有截然不同的度量单位或数量级。为了更好地展示这些变量之间的关系,使用双Y轴图是一个常见的选择。本文将介绍如何使用R语言来绘制双Y轴图,并提供一些实际示例。
I. 准备工作
在使用R语言绘制双Y轴图之前,我们需要加载一些必要的包和准备好数据。在本文中,我们将使用以下几个核心包:
library(ggplot2)
library(dplyr)
此外,我们还需要准备一个包含两个相关变量的数据集。为了方便说明,我们使用以下虚拟数据集作为示例:
data <- tibble(
x = 1:10,
y1 = c(10, 20, 30, 40, 50, 60, 70, 80, 90, 100),
y2 = c(5, 10, 15, 20, 25, 30, 35, 40, 45, 50)
)
在这个数据集中,我们有一个自变量x和两个因变量y1和y2。我们将使用这个数据集来展示如何绘制双Y轴图。
II. 使用ggplot绘制双Y轴图
ggplot2是R中一个强大的可视化包,可以轻松创建高质量的图形。下面是使用ggplot2绘制双Y轴图的步骤:
1. 创建基础图形
首先,我们需要创建一个基础图形,指定x轴和第一个y轴的变量。我们可以使用ggplot()函数来创建基础图形,并使用aes()函数指定变量。
base_plot <- ggplot(data, aes(x = x, y = y1))
2. 添加第一个y轴图层
接下来,我们可以通过使用geom_line()函数添加第一个y轴的线性图层。这将在基础图形上绘制一个表示第一个y轴变量的线。你可以根据需要自定义线的颜色、大小和类型。
base_plot <- base_plot + geom_line(color = "blue")
3. 添加第二个y轴图层
现在,我们需要添加第二个y轴的线性图层。然而,由于y1和y2具有不同的度量单位或数量级,它们往往不能共享同一坐标轴。为了解决这个问题,我们可以使用annotation_custom()函数在ggplot图形上方添加一个新的图层。这个新图层将充当第二个y轴。
base_plot <- base_plot + annotation_custom(
grob = grid::linesGrob(
y = unit(seq(0, 1, length.out = nrow(data)), "npc"),
gp = grid::gpar(
col = "red", lwd = 1.5
)
),
xmin = -Inf,
xmax = Inf,
ymin = 0,
ymax = 1
)
在这个代码片段中,我们使用linesGrob()函数创建了一个红色的线性图层,并使用annotation_custom()函数将其添加到基础图形上方。这个新图层在y轴方向上被缩放到0到1之间,并与第一个y轴对齐。
4. 调整第二个y轴图层
为了正确显示第二个y轴的刻度标签,我们需要使用scale_y_continuous()函数指定第二个y轴的显示范围和刻度。你可以根据需要自定义刻度标签和显示范围。
base_plot <- base_plot + scale_y_continuous(
sec.axis = sec_axis(
trans = ~ . * (max(datay1) / max(datay2)),
name = "y2"
),
limits = c(0, max(data$y1))
)
在这个代码片段中,我们使用sec_axis()函数创建了第二个y轴,并使用trans参数将y2的值转换为与y1相同的度量单位或数量级。我们还使用name参数为第二个y轴指定了一个标签。最后,我们使用limits参数指定了第二个y轴的显示范围(与第一个y轴相同)。
5. 添加图例
最后,我们可以使用labs()和guides()函数为图形添加标题和图例。
base_plot <- base_plot + labs(
title = "Double Y-axis Plot",
x = "x",
y = "y1",
color = "Variable"
) +
guides(color = guide_legend(title = "Variable"))
在这个代码片段中,我们使用labs()函数为整个图形添加了一个标题和轴标签。然后,我们使用guides()函数为图例添加了一个标题。
6. 显示图形
最后,我们可以使用print()函数显示图形。
print(base_plot)
这将在R的图形窗口中显示双Y轴图。
III. 示例
下面是使用上述步骤绘制的双Y轴图的完整示例代码:
library(ggplot2)
library(dplyr)
data <- tibble(
x = 1:10,
y1 = c(10, 20, 30, 40, 50, 60, 70, 80, 90, 100),
y2 = c(5, 10, 15, 20, 25, 30, 35, 40, 45, 50)
)
base_plot <- ggplot(data, aes(x = x, y = y1)) +
geom_line(color = "blue") +
annotation_custom(
grob = grid::linesGrob(
y = unit(seq(0, 1, length.out = nrow(data)), "npc"),
gp = grid::gpar(
col = "red", lwd = 1.5
)
),
xmin = -Inf,
xmax = Inf,
ymin = 0,
ymax = 1
) +
scale_y_continuous(
sec.axis = sec_axis(
trans = ~ . * (max(datay1) / max(datay2)),
name = "y2"
),
limits = c(0, max(data$y1))
) +
labs(
title = "Double Y-axis Plot",
x = "x",
y = "y1",
color = "Variable"
) +
guides(color = guide_legend(title = "Variable"))
print(base_plot)
以下是上述示例代码运行后绘制的双Y轴图
IV. 结论
本文介绍了如何使用R语言绘制双Y轴图。通过加载ggplot2包和准备好数据,我们使用ggplot2的强大功能创建了一个基础图形,并在其上添加了第一个y轴的线性图层。然后,我们使用annotation_custom()函数创建并添加了第二个y轴的图层,来表示具有不同度量单位或数量级的变量。
为了正确显示第二个y轴的刻度标签,我们使用scale_y_continuous()函数指定了第二个y轴的显示范围和刻度。最后,我们使用labs()和guides()函数为整个图形添加了标题、轴标签和图例。
如果你想进行更多自定义,你可以根据需要调整颜色、线型、标签等等。ggplot2提供了许多其他功能,如添加点、条形图等,你可以根据你的数据和需求进行进一步的探索和实验。
极客教程