如何在 ggpairs 中使用第二条相关线自定义图形

How to customize graph with 2nd correlation line in ggpairs

继 post、 我用下面的代码制作了图表

library("GGally")
library("ggplot2")
data(iris)

lowerFn <- function(data, mapping, method = "lm", ...) {
  p <- ggplot(data = data, mapping = mapping) +
    geom_point(colour = "blue") +
    geom_smooth(method = method, color = "red", ...)
  p
}

ggpairs(
  iris[, 1:4], lower = list(continuous = wrap(lowerFn, method = "lm")),
  diag = list(continuous = wrap("barDiag", colour = "blue")),
  upper = list(continuous = wrap("cor", size = 10))
)

我的问题是;

  1. 如何通过在图上添加“Sil”变量效应作为相关线来制作相同样式的散点图矩阵图。就像这张图将 Si 变量效应显示为 2 条相关线

数据在这里,(添加 Sil 变量的虹膜数据) https://docs.google.com/spreadsheets/d/15voAmJ7vcozmHYKYnHxFd_3A3fkkIvzQV6zi44lIEGg/edit#gid=0

如果您想为点着色并生成回归拟合线 group 然后你需要将美学映射到一些变量。

在一般情况下,您可以将映射添加到顶层,并且 这将按组拆分所有面板。

ggpairs(iris, columns=1:4, mapping=aes(colour=Species))

但是,如果您只想在面板的一个部分中按组绘图,我认为您需要做更多的工作。一种方法是首先将您的用户函数更改为以下内容,这提供了一个额外的 emap 参数,该参数将仅在 lowerFn 中控制美学。

lowerFn <- function(data, mapping, emap=NULL, method = "lm", ...) {
  # mapping <- c(mapping, emap)
  # class(mapping) = "uneval" # need this to combine the two aes
  # Can use this instead
  mapping <- ggplot2:::new_aes( c(mapping, emap))
  p <- ggplot(data = data, mapping = mapping) +
    geom_point() +
    geom_smooth(method = method, ...) +
    theme_classic() # to get the white background and prominent axis
  p
}

然后您可以使用以下方式调用它,这应该保留对角线和上部美学。

ggpairs(
  iris, columns=1:4,
  lower = list(continuous = wrap(lowerFn, 
                                 method = "lm", fullrange=TRUE, se=FALSE,
                                 emap=aes(color=Species))))                             

这会产生

您当然可以将您的分组变量硬编码到用户函数中:

lowerFn <- function(data, mapping, method = "lm", ...) {
  p <- ggplot(data = data, mapping = mapping) +
    geom_point(aes(colour=Species)) +
    geom_smooth(method = method, aes(colour=Species), ...)
  p
}

ggpairs(
  iris, columns=1:4,
  lower = list(continuous = 
                 wrap(lowerFn, method = "lm", 
                      fullrange=TRUE, se=FALSE)))

注释:当你在geom_point中添加colour参数时 或 geom_smooth 在您的用户函数中,它将否决映射的 colour 例如比较以下结果

ggplot(iris, aes(Sepal.Length, Sepal.Width, col=Species)) +
  geom_smooth(se=FALSE)

ggplot(iris, aes(Sepal.Length, Sepal.Width, col=Species)) +
  geom_smooth(col="red", se=FALSE)

问?如何在图表上输入回归线的键值?

如果您使用全局/顶级美学,您可以使用 ggpairs(iris, columns=1:4, aes(colour=Species), legend=1) 和普通 ggplot theme 函数来控制它。这不能在这里完成,因为在自定义函数中使用了分组变量。但是,该包提供了一种使用 legend 参数添加自定义图例的方法;您可以在 ggpairs 之外生成一个虚拟图例,然后在绘图过程中添加它。

leg <- grab_legend(ggplot(data=iris, aes(x=NA, y=NA, colour=Species)) +
              geom_line() + theme(legend.direction = "horizontal"))

ggpairs(
  iris, columns=1:4, legend=leg,
  lower = list(continuous = 
                 wrap(lowerFn, method = "lm", 
                      emap=aes(color=Species),
                      fullrange=TRUE, se=FALSE))) +
  theme(legend.position = "top")