知乎问答 | 如何在同一坐标系下绘制多幅图形

在知乎上看到这么一个问题:rstudio将两个图放在同一坐标轴用什么函数?在这里回答一下。

知乎问答 | 如何在同一坐标系下绘制多幅图形_第1张图片

小编推测提问者是想问“使用R语言绘图时怎么把不同的图形绘制在同一个坐标系中”。那么这个问题的本质上其实是进行图形叠加。在ggplot2工具包及其拓展包中,这个问题很好解决,因为几何图形函数通过符号"+"就能依次在同一坐标系下绘制相应的图形。本篇就来介绍基础绘图系统解决这一问题的思路。

之前,小编已经介绍了如何使用基础绘图系统的fig参数进行拼图。从下图可以看出,这三个子图明显不在同一坐标系,而是被“拼”在一起的。

知乎问答 | 如何在同一坐标系下绘制多幅图形_第2张图片

想在同一坐标下进行组图,主要有两个思路:调用函数的add参数和使用低级绘图函数。下面小编依次进行介绍。

add参数

graphics工具包中,一般情况下,每使用一个绘图主函数,就会重新建立一个新的绘图页面;而当add参数被设置为TRUE时,则会使用已有的绘图页面和坐标系。

示例一

plot(mtcars$mpg, mtcars$qsec,
     pch = 21, bg = "skyblue",
     xlim = c(5, 35), ylim = c(12, 24), # 设置坐标范围
     xlab = "mpg", ylab = "qsec")
boxplot(mtcars$mpg, horizontal = T, at = 13,
        width = 2, notch = T, col = "coral",
        add = T) # 设置add参数
boxplot(mtcars$qsec, at = 7.5,
        width = 2, notch = T, col = "darkgreen",
        add = T) # 设置add参数
知乎问答 | 如何在同一坐标系下绘制多幅图形_第3张图片

需要注意以下几点:

  • 第一个绘图主函数不需要设置add参数,但要设定合适的坐标范围,以涵盖后续图形的坐标范围;

  • 从第二个绘图主函数开始,均需设置add参数;

  • 设置add = TRUE的函数,其布局参数会自动失效,也就是说只有第一个绘图主函数能够对绘图布局要素如坐标范围、标签等进行调整。

需要注意的是,大部分绘图主函数都有add参数,但并非所有,具体可查看相应函数的帮助文档。

低级函数

当主函数没有add参数时,可以考虑使用低级函数。这里以plot函数为例。

plot函数根据xy参数的类型(数值向量/因子向量/矩阵)可绘制不同的图形。其中当xy参数均为数值向量时,绘制散点图和折线图,此时plot函数没有add参数。

因此,若想在已有坐标系中叠加散点图或折线图,不能使用plot(x, y, add = T)这种方式,而应使用对应的低级函数pointslines。低级函数只能在主函数之后使用,并继续使用主函数生成的绘图页面和坐标系。

示例二

plot(mtcars$mpg, mtcars$qsec,
     pch = 21, bg = "skyblue",
     xlim = c(5, 35), ylim = c(12, 24),
     xlab = "mpg", ylab = "qsec")
boxplot(mtcars$mpg, horizontal = T, at = 13,
        width = 2, notch = T, col = "coral",
        add = T)
boxplot(mtcars$qsec, at = 7.5,
        width = 2, notch = T, col = "darkgreen",
        add = T)
# 线性模型拟合
model <- lm(qsec ~ mpg, data = mtcars)
lines(mtcars$mpg, fitted(model),
      col = "red") # 添加拟合直线
知乎问答 | 如何在同一坐标系下绘制多幅图形_第4张图片

双坐标轴

当两个图形的因变量的取值范围相差较大时,可以使用双坐标轴。严格来讲,双坐标轴不算是在同一坐标系下。

设置双坐标轴的思路如下:

  • 第一个绘图函数正常使用,第二个绘图函数前加上par(new = T)

  • 两个绘图函数的xlim参数设置保持一致;

  • 在第二个绘图函数中,通过设置ann = Faxes = F隐藏自动生成的坐标轴及其刻度;

  • 使用辅助函数axis在右侧生成次坐标轴及其刻度;

  • 使用辅助函数mtext在右侧添加次坐标轴名称标签;为了防止右侧页边距过小导致标签越出边界,可在绘图前修改par函数的plt参数。

示例三

par(plt = c(0.12, 0.88, 0.25, 0.90))
plot(mtcars$mpg, mtcars$qsec,
     pch = 21, bg = "skyblue",
     xlim = c(5, 35), ylim = c(12, 24),
     xlab = "mpg", ylab = "qsec")
par(new = T)
plot(mtcars$mpg, mtcars$wt,
     pch = 21, bg = "coral", 
     xlim = c(5, 35),
     ann = F, axes = F)
axis(side = 4)
mtext("wt", side = 4, line = 3)
legend("topright", legend = c("qsec", "wt"),
       pch = 21, pt.bg = c("skyblue", "coral"))
知乎问答 | 如何在同一坐标系下绘制多幅图形_第5张图片

相关阅读

  1. graphics | 基础绘图系统(三)——添加文本标注、坐标轴线和图例

  2. graphics | 基础绘图系统(四)——柱状图、直方图、扇形图、箱形图和函数图象

  3. graphics | 基础绘图系统(五)——plot函数功能再探和低级绘图函数

  4. 技巧 | 如何使用R语言的基础绘图系统的拼图功能

你可能感兴趣的:(可视化,数据可视化,css,python,html)