火山图

火山图是展示全部基因的p值和fold change最为直观的方式。

绘制火山图需要输入一个数据框,行为基因,列包括基因名、log2FoldChange、p值。

library(ggplot2)
library(ggrepel)

res_sig <- readr::read_csv(file = '_.csv')
res_sig

火山图(无标签)

可以先绘制一个不含标签的火山图(指不知道某点代表的基因):

## draw volcano plot ----
volcano_plot <- res_sig |> ggplot(aes(
  x = log2FoldChange,
  y = -log10(pvalue),
  color = signif
)) +
  geom_point(size = 1.5) +
  scale_color_manual(values = c('steelblue', 'gray', 'brown')) +
  xlim(c(-8, 8)) + # 调整x轴的取值范围
  geom_vline(
    xintercept = c(-1, 1),
    lty = 'dashed',
    col = "black",
    lwd = 0.8
  ) +
  geom_hline(
    yintercept = -log10(0.05),
    lty = 'dashed',
    col = "black",
    lwd = 0.8
  ) +
  labs(x = "log2FoldChange", y = "-log10Pvalue") +
  ggtitle("RNA seq volcano plot") +
  theme(
    plot.title = element_text(hjust = 0.5),
    legend.position = "right",
    legend.title = element_blank()
  ) +
  ggprism::theme_prism(border = T)
volcano_plot

# save volcano plot
if(F) {
  ggsave(
    volcano_plot,
    './volcano.pdf',
    width = 2000,
    height = 1250,
    units = 'px',
    dpi = 300
  )
}

火山图(有标签)

再绘制一个含标签的火山图用于参照,在排版软件中手动添加文本框。

gene_label是一个存储标签信息的数据框,包含标签显示的文字(此处为gene列)、标签的坐标位置(此处为log2FoldChange列和pvalue列)。

因此gene_label可以是一个单独的数据框,也可以在原数据框(res_sig)单独加一label列,该列中将需要添加标签的单元格填入基因名,其余留空。

此处选择制作一个单独的数据框。

gene_label <- res_sig |>
  dplyr::filter(signif != 'ns') |>
  dplyr::mutate(distance = log2FoldChange^2 + log10(pvalue)^2) |>
  dplyr::group_by(signif) |>
  slice_max(distance, n = 10) |>
  ungroup()

volcano_plot_label <- volcano_plot +
  geom_label_repel(
    data = gene_label,
    aes(label = gene),
    size = 4,
    color = 'blue',
    box.padding = unit(0.5, "lines"),
    point.padding = unit(0.8, "lines"),
    segment.color = "black",
    show.legend = FALSE,
    max.overlaps = 10000
  )
volcano_plot_label

渐变火山图

点的颜色和大小的渐变

volcano_plot_gradient <- volcano_plot +
  scale_color_gradientn(
    values = seq(0, 1, 0.2),
    colors = c("#39489f", "#39bbec", "#f9ed36", "#f38466", "#b81f25")
  ) + #指定颜色渐变模式
  scale_size_continuous(range = c(2, 3)) + #指定散点大小渐变模式