如何使用 ggplot 在散点图上着色背景但仍显示 R 中的数据点?

How to colour background on a scatterplot using ggplot but still show data points in R?

这是我的第一个问题,希望这是有道理的,感谢您提前抽出时间!

我正在尝试生成一个散点图,其中的数据点是来自 RNA-Seq 数据集的 2 种处理的基因的 log2 表达值。使用这段代码,我生成了下面的图:

   ggplot(control, aes(x=log2_iFGFR1_uninduced, y=log2_iFGFR4_uninduced)) + 
       geom_point(shape = 21, color = "black", fill = "gray70") +
       ggtitle("Uninduced iFGFR1 vs Uninduced iFGFR4 ") +
       xlab("Uninduced iFGFR1") + 
       ylab("Uninduced iFGFR4") +
       scale_y_continuous(breaks = seq(-15,15,by = 1)) +
       scale_x_continuous(breaks = seq(-15,15,by = 1)) +
       geom_abline(intercept = 1, slope = 1, color="blue", size = 1) +
       geom_abline(intercept = 0, slope = 1, colour = "black", size = 1) +
       geom_abline(intercept = -1, slope = 1, colour = "red", size = 1) + 
       theme_classic() + 
       theme(plot.title = element_text(hjust=0.5))

当前散点图:

但是,我想将红线下方的绘图背景更改为浅红色,将蓝线上方的绘图背景更改为浅蓝色,但仍然能够看到这些区域中的数据点。到目前为止,我已经尝试在下面的代码中使用多边形。

    pol1 <- data.frame(x = c(-14, 15, 15), y = c(-15, -15, 14))
    pol2 <- data.frame(x = c(-15, -15, 14), y = c(-14, 15, 15))

    ggplot(control, aes(x=log2_iFGFR1_uninduced, y=log2_iFGFR4_uninduced)) + 
       geom_point(shape = 21, color = "black", fill = "gray70") +
       ggtitle("Uninduced iFGFR1 vs Uninduced iFGFR4 ") +
       xlab("Uninduced iFGFR1") + 
       ylab("Uninduced iFGFR4") +
       scale_y_continuous(breaks = seq(-15,15,by = 1)) +
       scale_x_continuous(breaks = seq(-15,15,by = 1)) +
       geom_polygon(data = pol1, aes(x = x, y = y), color ="pink1") +
       geom_polygon(data = pol2, aes(x = x, y = y), color ="powderblue") +
       geom_abline(intercept = 1, slope = 1, color="blue", size = 1) +
       geom_abline(intercept = 0, slope = 1, colour = "black", size = 1) +
       geom_abline(intercept = -1, slope = 1, colour = "red", size = 1) + 
       theme_classic() + 
       theme(plot.title = element_text(hjust=0.5))

新散点图:

但是,这些多边形隐藏了我在这个区域的数据点,我不知道如何保持多边形颜色但也能看到数据点。我也曾尝试将 "fill = NA" 添加到 geom_polygon 代码,但这会使该区域变白并且只保留彩色边框。此外,这些多边形移动了我的轴限制,所以我如何将轴更改为从 -15 开始到 15 结束,而不是有多余的不需要的长度?

任何帮助将不胜感激,因为我已经为此苦苦挣扎了一段时间,并询问了无法提供帮助的朋友和同事。

谢谢,

丽芙

您的问题分为两部分,因此我将使用虚拟数据集依次回答每个部分:

df <- data.frame(x=rnorm(20,5,1), y=rnorm(20,5,1))

停止 geom_polygon 隐藏 geom_point

Stefan 评论了这个问题的答案。这是一个例子。 ggplot 中的操作顺序很重要。您创建的绘图是按顺序执行的每个 geom(绘图操作)的结果。在你的例子中,你在 geom_point 之后有 geom_polygon,所以这意味着它将在 geom_point 的顶部 上绘制 。要将点绘制在多边形之上,只需在 geom_polygon 之后设置 geom_point。这是一个说明性示例:

p <- ggplot(df, aes(x,y)) + theme_bw()
p + geom_point() + xlim(0,10) + ylim(0,10)

现在如果我们在后面添加一个geom_rect,它会隐藏点:

p + geom_point() +
    geom_rect(ymin=0, ymax=5, xmin=0, xmax=5, fill='lightblue') +
    xlim(0,10) + ylim(0,10)

防止这种情况的方法是将 geom_pointgeom_rect 的顺序颠倒过来。它适用于所有 geoms.

p + geom_rect(ymin=0, ymax=5, xmin=0, xmax=5, fill='lightblue') +
    geom_point() +
    xlim(0,10) + ylim(0,10)

去除轴与轴界限之间的白色space

问题的第二部分询问如何去除 geom_polygon 和坐标轴边缘之间的白色 space。请注意我是如何使用 xlimylim 来设置限制的?它是 scale_x_continuous(limits=...)scale_y_continuous(limits=...) 的快捷方式;但是,我们可以在 scale_... 函数中使用参数 expand= 来设置在到达轴之前到 "expand" 绘图的距离。您可以独立设置轴上限和轴下限的扩展设置,这就是为什么此参数需要一个双分量数字向量,类似于 limits= 参数。

去除白色的方法如下space:

p + geom_rect(ymin=0, ymax=5, xmin=0, xmax=5, fill='lightblue') +
geom_point() +
scale_x_continuous(limits=c(0,10), expand=c(0,0)) +
scale_y_continuous(limits=c(0,10), expand=c(0,0))