如何使用 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_point
和 geom_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。请注意我是如何使用 xlim
和 ylim
来设置限制的?它是 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))
这是我的第一个问题,希望这是有道理的,感谢您提前抽出时间!
我正在尝试生成一个散点图,其中的数据点是来自 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_point
和 geom_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。请注意我是如何使用 xlim
和 ylim
来设置限制的?它是 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))