R语言进阶绘图:火山图
常规火山图
下面的示例中,我将创建一个虚构的数据集,展示前几行,并绘制一张美观、详尽的火山图。我们将使用ggplot2
包创建火山图。请注意,这个示例使用了随机生成的数据,实际研究中应使用真实数据。
# 安装并加载所需的包
if (!requireNamespace("ggplot2", quietly = TRUE))
install.packages("ggplot2")
library(ggplot2)# 示例数据
set.seed(123) # 设置随机数种子,以便生成可重现的数据
gene_ids <- paste0("Gene", 1:1000)
log2_fold_changes <- rnorm(1000, mean = 0, sd = 1)
p_values <- runif(1000, min = 0, max = 1)
# 创建数据框
volcano_data <- data.frame(GeneID = gene_ids,
Log2FoldChange = log2_fold_changes,
PValue = p_values)
# 展示前几行数据
head(volcano_data)
# 计算-log10(PValue)
volcano_data$NegLog10PValue <- -log10(volcano_data$PValue)
# 根据显著性和差异表达阈值对基因进行分组
threshold_p_value <- 0.05
threshold_log2_fold_change <- 1
volcano_data$Group <- "Not significant"
volcano_data$Group[volcano_data$PValue < threshold_p_value &
abs(volcano_data$Log2FoldChange) > threshold_log2_fold_change] <- "Significant"
# 绘制火山图
p <- ggplot(volcano_data, aes(x = Log2FoldChange, y = NegLog10PValue, color = Group)) +
geom_point(alpha = 0.8, size = 1.5) +
scale_color_manual(values = c("Not significant" = "gray", "Significant" = "red")) +
geom_hline(yintercept = -log10(threshold_p_value), linetype = "dashed", color = "blue") +
geom_vline(xintercept = c(-threshold_log2_fold_change, threshold_log2_fold_change), linetype = "dashed", color = "blue") +
xlab("log2(Fold Change)") +
ylab("-log10(P-Value)") +
ggtitle("火山图") +
theme_minimal() +
theme(legend.position = "bottom")
# 显示图形
print(p)
# 保存为PDF文件
ggsave("volcano_plot.pdf", plot = p, width = 10, height = 7, units = "in")
解释:
- 首先,我们生成了一个包含1000个基因的虚构数据集,每个基因具有log2(倍数变化)和P值。实际研究中,这些值通常来自差异表达基因分析。
- 我们为数据集添加了一个新列,表示P值的负对数值(-log10(PValue))。
- 我们定义了显著性和差异表达阈值,并根据这些阈值对基因进行了分组。在此示例中,我们使用P值小于0.05和log2(倍数变化)的绝对值大于1作为显著性和差异表达阈值。
- 使用
ggplot2
包绘制火山图。我们根据基因所属的分组(显著或非显著)给散点上色。非显著基因为灰色,显著基因为红色。 - 添加水平和垂直虚线,表示显著性和差异表达阈值。蓝色水平虚线表示-log10(P值)的阈值,蓝色垂直虚线表示log2(倍数变化)的阈值。
- 使用
theme_minimal()
设置图形主题为简约风格,并将图例位置设置在底部。 - 使用
ggsave()
函数将火山图保存为PDF文件,指定宽度为10英寸,高度为7英寸。
这个示例展示了如何使用虚构数据创建火山图。在实际应用中,你需要使用实际的差异表达基因数据来生成火山图。火山图可用于一目了然地展示大量基因的表达变化和显著性水平,帮助研究人员识别潜在的生物学上重要的基因。为了使火山图看起来更美观,我们可以调整点的样式、大小和颜色。此外,我们还可以调整轴的标题和图形标题的字体大小,以及优化坐标轴刻度。
下面是一个修改后的火山图示例:
# 加载所需的包
library(ggplot2)# 示例数据
set.seed(123) # 设置随机数种子,以便生成可重现的数据
gene_ids <- paste0("Gene", 1:1000)
log2_fold_changes <- rnorm(1000, mean = 0, sd = 1.5)
p_values <- runif(1000, min = 0, max = 1)
# 创建数据框
volcano_data <- data.frame(GeneID = gene_ids,
Log2FoldChange = log2_fold_changes,
PValue = p_values)
# 计算-log10(PValue)
volcano_data$NegLog10PValue <- -log10(volcano_data$PValue)
# 根据显著性和差异表达阈值对基因进行分组
threshold_p_value <- 0.05
threshold_log2_fold_change <- 1
volcano_data$Group <- "Not significant"
volcano_data$Group[volcano_data$PValue < threshold_p_value &
abs(volcano_data$Log2FoldChange) > threshold_log2_fold_change] <- "Significant"
# 绘制火山图
p <- ggplot(volcano_data, aes(x = Log2FoldChange, y = NegLog10PValue, color = Group)) +
geom_point(alpha = 0.8, size = 2) +
scale_color_manual(values = c("Not significant" = "darkgray", "Significant" = "darkred")) +
geom_hline(yintercept = -log10(threshold_p_value), linetype = "dashed", color = "dodgerblue") +
geom_vline(xintercept = c(-threshold_log2_fold_change, threshold_log2_fold_change), linetype = "dashed", color = "dodgerblue") +
xlab("log2(Fold Change)") +
ylab("-log10(P-Value)") +
ggtitle("火山图") +
theme_minimal() +
theme(legend.position = "bottom",
axis.title = element_text(size = 14),
plot.title = element_text(size = 16, hjust = 0.5),
axis.text = element_text(size = 12))
# 显示图形
print(p)
# 保存为PDF文件
ggsave("volcano_plot_improved.pdf", plot = p, width = 10, height = 7, units = "in")
在这个修改后的示例中,我们采用了以下调整:
- 增加点的大小(
size = 2
),使其更容易辨认。 - 使用深灰色和深红色作为点的颜色,使其更醒目。
- 使用dodgerblue作为虚线的颜色,使其与点的颜色形成对比。
- 增加轴标题、图形标题和坐标轴刻度的字体大小,使其更易于阅读。
多组聚类火山图
为了创建多组聚类火山图,我们首先需要生成一个包含多个分组的数据集。在这个示例中,我们将创建三个分组(A、B和C)。接下来,我们将使用facet_wrap()
函数制作多组聚类火山图。请注意,这个示例使用了随机生成的数据,实际研究中应使用真实数据。
# 加载所需的包
library(ggplot2)# 示例数据
set.seed(123) # 设置随机数种子,以便生成可重现的数据
group_labels <- c("A", "B", "C")
gene_ids <- paste0("Gene", 1:1000)
# 生成每个分组的数据
group_data_list <- lapply(group_labels, function(group_label) {
log2_fold_changes <- rnorm(1000, mean = 0, sd = 1.5)
p_values <- runif(1000, min = 0, max = 1)
data.frame(Group = group_label,
GeneID = gene_ids,
Log2FoldChange = log2_fold_changes,
PValue = p_values)
})
# 合并所有分组的数据
all_data <- do.call(rbind, group_data_list)
# 计算-log10(PValue)并进行显著性分组
all_data$NegLog10PValue <- -log10(all_data$PValue)
threshold_p_value <- 0.05
threshold_log2_fold_change <- 1
all_data$Significance <- "Not significant"
all_data$Significance[all_data$PValue < threshold_p_value &
abs(all_data$Log2FoldChange) > threshold_log2_fold_change] <- "Significant"
# 绘制多组聚类火山图
p <- ggplot(all_data, aes(x = Log2FoldChange, y = NegLog10PValue, color = Significance)) +
geom_point(alpha = 0.8, size = 2) +
scale_color_manual(values = c("Not significant" = "darkgray", "Significant" = "darkred")) +
geom_hline(yintercept = -log10(threshold_p_value), linetype = "dashed", color = "dodgerblue") +
geom_vline(xintercept = c(-threshold_log2_fold_change, threshold_log2_fold_change), linetype = "dashed", color = "dodgerblue") +
xlab("log2(Fold Change)") +
ylab("-log10(P-Value)") +
ggtitle("多组聚类火山图") +
theme_minimal() +
theme(legend.position = "bottom",
axis.title = element_text(size = 14),
plot.title = element_text(size = 16, hjust = 0.5),
axis.text = element_text(size = 12)) +
facet_wrap(~ Group, ncol = 3)
# 显示图形
print(p)
# 保存为PDF文件
ggsave("multi_group_volcano_plot.pdf", plot = p, width = 16, height = 7, units = "in")
在这个示例中,我们进行了以下操作:
- 为三个分组(A、B和C)生成随机数据。
- 使用
lapply()
函数,为每个分组创建数据框,并使用do.call()
函数将这些数据框合并为一个数据框。 - 计算-log10(PValue)并按显著性和差异表达阈值对基因进行分组。
- 使用
facet_wrap()
函数在火山图中添加分组信息。facet_wrap(~ Group, ncol = 3)
的作用是根据"Group"变量将数据分成多个子图,每行包含3个子图。 - 使用与之前的火山图相同的样式,包括点的大小、颜色、虚线和字体大小,使图像更美观。
- 使用
ggsave()
函数将多组聚类火山图保存为PDF文件。这个示例展示了如何创建一个多组聚类火山图。在实际应用中,你需要使用实际的差异表达基因数据来生成火山图。多组聚类火山图可以帮助研究人员一目了然地比较不同实验组之间的基因表达变化和显著性水平。
阅读剩余
THE END