2025-05-28
GO/KEGG富(fu)集(ji),每個人都做過,但富(fu)集(ji)結果中有很多條(tiao)目,每個條(tiao)目中又(you)(you)有很多參(can)數需要(yao)展示(shi)(shi)(比(bi)如(ru)富(fu)集(ji)到的(de)基因數,P值,richfactor等),如(ru)果用常規的(de)Barplot, Dotplot來展示(shi)(shi)的(de)話,就(jiu)(jiu)需要(yao)多張圖片(pian)分(fen)別展示(shi)(shi)部分(fen)信息,就(jiu)(jiu)會(hui)顯得圖片(pian)比(bi)較(jiao)繁雜。那有沒(mei)有能一張圖就(jiu)(jiu)展示(shi)(shi)完所有上述參(can)數信息,又(you)(you)比(bi)較(jiao)美觀的(de)圖呢?有的(de)兄弟,有的(de)。富(fu)集(ji)分(fen)析圈圖就(jiu)(jiu)是你(ni)要(yao)找的(de)圖。
圖1 富集分析圈圖
圖(tu)(tu)1中(zhong)展示的就是富集分析(xi)圈圖(tu)(tu),由(you)4層環構成(cheng),圓圈中(zhong)心和右(you)側是各層的圖(tu)(tu)例(li)。從內圈到外分別展示了(le):
1.richfactor: 最圈代表富集(ji)倍(bei)數(shu),在0-1范圍內取值,值越(yue)大格數(shu)越(yue)多,顏色代表GO/KEGG類別;
2. 分組基因數:第二圈顏色(se)代表(biao)上下調基(ji)因,數字代表(biao)基(ji)因數量(liang);
3. 富集到的基因數與P值: 第三圈代表(biao)-log10(pvalue)值,顏色深淺代表(biao)值的高低;
4. 通路id及分類:第四(si)圈代表GO/KEGG條目ID,顏色(se)代表GO/KEGG類別(bie)。
下面(mian),我們來一(yi)層(ceng)一(yi)層(ceng)地畫這張圖。
1.數據準備:從富(fu)集結果中(zhong)提取(qu)每個(ge)Term生成下面這張表格(ge),在R中(zhong)讀(du)取(qu)它
2.第一圈:我們根據表格中(zhong)的通(tong)路分類給(gei)通(tong)路涂上(shang)不(bu)同的顏(yan)色(se),并(bing)且用通(tong)路總基因數給(gei)圈圖(tu)加(jia)上(shang)坐標。
library(circlize)
library(grid)
library(gridBase)
library(graphics)
library(ComplexHeatmap)
circlize_df <-read.csv(‘富(fu)集結果表格(ge)’)
circlize_df$Category_color<-color[as.numeric(factor(circlize_df$Category))]
rownames(circlize_df)<-circlize_df$GO
circlize_df$gene_num.min <- 0
circlize_df$gene_num.rich <- circlize_df$Total
circlize_df$gene_num.max <- max(circlize_df$gene_num.rich)
circlize_df$stat_val <- -log10(circlize_df$adjustPvalue)
title_second_data <- "-Log10(adjust.Pvalue)"
circle_size <- unit(1, "snpc")
circos.par(gap.degree = 0.5, start.degree = 90)
plot_data <- circlize_df[, c("GO", "gene_num.min", "gene_num.max")]
plot.new()
pushViewport(viewport(
x = 0, y = 0.5, width = circle_size, height = circle_size,
just = c("left", "center")
))
par(omi = gridOMI(), new = TRUE)
circos.genomicInitialize(plot_data, plotType = NULL)
circos.track(
ylim = c(0, 1), track.margin = c(0, 0), track.height = 0.08, bg.border = NA, bg.col = circlize_df$Category_color,
panel.fun = function(x, y) {
ylim <- get.cell.meta.data("ycenter")
xlim <- get.cell.meta.data("xcenter")
sector.name <- get.cell.meta.data("sector.index")
circos.axis(h = "top", labels.cex = 0.6, labels.pos.adjust = T, labels.col = "#000000", labels.niceFacing = FALSE)
circos.text(xlim, ylim, sector.name, cex = 0.6, col = "#000000", niceFacing = FALSE)
}
)
圖2 富集分析圈圖的第一圈
3.第二圈:繪制(zhi)富(fu)集的基(ji)因和富(fu)集p值。
plot_data <- circlize_df[, c("GO", "gene_num.min", "gene_num.rich", "stat_val")]
label_data <- circlize_df[, "gene_num.rich"]
label_data <- as.data.frame(label_data)
rownames(label_data) <- circlize_df$GO
p_max <- round(max(circlize_df[["stat_val"]])) + 1
colorsChoice <- colorRampPalette(second_col)
color_assign <- colorRamp2(breaks = 0:p_max, col = colorsChoice(p_max + 1))
circos.genomicTrackPlotRegion(
plot_data,
track.margin = c(0, 0), track.height = 0.1, bg.border = NA, stack = TRUE,
panel.fun = function(region, value, ...) {
circos.genomicRect(region, value, col = color_assign(value[[1]]), border = NA, ...)
ylim <- get.cell.meta.data("ycenter")
xlim <- label_data[get.cell.meta.data("sector.index"), 1] / 2
sector.name <- label_data[get.cell.meta.data("sector.index"), 1]
circos.text(xlim, ylim, sector.name, cex = 0.8, col = "#000000", niceFacing = FALSE)
}
)
圖3 添加(jia)富集(ji)分析圈(quan)圖的第二(er)圈(quan)
4.第三圈:分組基因數。這里我們用上(shang)下調基因作為分組。
circlize_df$up.proportion <- circlize_df$Up / (circlize_df$Up+circlize_df$Down)
circlize_df$down.proportion <- circlize_df$Down / (circlize_df$Up+circlize_df$Down)
circlize_df$up_v <- circlize_df$up.proportion * circlize_df$gene_num.max
plot_data_up <- circlize_df[, c("GO", "gene_num.min", "up_v")]
names(plot_data_up) <- c("id", "start", "end")
plot_data_up$type <- 1
circlize_df$down_v <- circlize_df$down.proportion * circlize_df$gene_num.max + circlize_df$up_v
plot_data_down <- circlize_df[, c("GO", "up_v", "down_v")]
names(plot_data_down) <- c("id", "start", "end")
plot_data_down$type <- 2
plot_data <- rbind(plot_data_up, plot_data_down)
label_data <- circlize_df[, c("up_v", "down_v", "Up", "Down")]
label_data <- as.data.frame(label_data)
rownames(label_data) <- circlize_df$GO
color_assign <- colorRamp2(breaks = c(1, 2), col = c(upcol, downcol))
circos.genomicTrackPlotRegion(
plot_data,
track.margin = c(0, 0), track.height = 0.1, bg.border = NA, stack = TRUE,
panel.fun = function(region, value, ...) {
circos.genomicRect(region, value, col = color_assign(value[[1]]), border = NA, ...)
ylim <- get.cell.meta.data("cell.bottom.radius") - 0.5
xlim <- label_data[get.cell.meta.data("sector.index"), 1] / 2
sector.name <- ifelse(label_data[get.cell.meta.data("sector.index"), 3] > 0, label_data[get.cell.meta.data("sector.index"), 3], " ")
circos.text(xlim, ylim, sector.name, cex = 0.6, col = "#000000", niceFacing = FALSE)
xlim <- (label_data[get.cell.meta.data("sector.index"), 2] + label_data[get.cell.meta.data("sector.index"), 1]) / 2
sector.name <- ifelse(label_data[get.cell.meta.data("sector.index"), 4] > 0, label_data[get.cell.meta.data("sector.index"), 4], " ")
circos.text(xlim, ylim, sector.name, cex = 0.6, col = "#000000", niceFacing = FALSE)
}
)
圖(tu)4 添加(jia)富集分析圈圖(tu)的第三圈
5.第四圈:繪制富集因子。
plot_data <- circlize_df[, c("GO", "gene_num.min", "gene_num.max", "RichFactor")]
label_data <- circlize_df[, c("Category", "RichFactor")]
label_data$RichFactor <- round(label_data$RichFactor, 2)
label_data <- as.data.frame(label_data)
rownames(label_data) <- circlize_df$GO
circos.genomicTrack(
plot_data,
track.margin = c(0.01, 0.04), track.height = 0.3, ylim = c(0.05, 0.95), bg.col = "gray95", bg.border = NA, # ylim = c(0, 1)
panel.fun = function(region, value, ...) {
sector.name <- get.cell.meta.data("sector.index")
for (i in seq(0.1, 0.9, by = 0.1)) {
circos.lines(c(0, max(region)), c(i, i), col = "gray", lwd = 0.3)
}
circos.genomicRect(region, value, col = circlize_df[sector.name,'Category_color'], border = NA, ytop.column = 1, ybottom = 0, ...)
ylim <- label_data[get.cell.meta.data("sector.index"), 2] - 0.05
xlim <- get.cell.meta.data("xcenter")
sector.name <- label_data[sector.name, 2]
circos.text(xlim, ylim, sector.name, cex = 0.8, col = "#000000", niceFacing = FALSE)
}
)
圖(tu)5 添加富集分(fen)析圈圖(tu)的第四圈
6.最后一步:繪制圖例。
updown_legend <- Legend(
labels = c("Number of Genes", "Up-regulated", "Down-regulated", "Rich Factor(0-1)"),
graphics = list(
function(x = 0, y, w, h) {
grid.draw(gTree(
children = gList(
rectGrob(x = 0, y, w * 2.2, h * 1, gp = gpar(fill = "gray80", col = "gray80")),
textGrob("100", x = 0, y)),
gp = gpar(col = "black", fontsize = 10, fontface = "bold")))},
function(x = 0, y, w, h) {
grid.rect(x = 0, y, w * 2.2, h * 1, gp = gpar(fill = upcol, col = upcol))},
function(x = 0, y, w, h) {
grid.rect(x = 0, y, w * 2.2, h * 1, gp = gpar(fill = downcol, col = downcol))},
function(x = 0, y, w, h) {
grid.polygon(y = c(0.09, -0.05, -0.12, 0.16), x = c(-0.13, -0.13, 0.13, 0.13), gp = gpar(fill = "gray85", col = "gray85"))}),
labels_gp = gpar(fontsize=10), # grid_height = unit(0.6, 'cm'), grid_width=unit(0.8, 'cm'),
row_gap = unit(2, "mm"))
category_legend <- Legend(
labels = unique(circlize_df$Category),
type = "points", pch = NA, background = unique(circlize_df$Category_color),
labels_gp = gpar(fontsize = 10), row_gap = unit(1, "mm")
) # grid_height = unit(0.6, 'cm'), grid_width = unit(0.8, 'cm'))
pvalue_legend <- Legend(
col_fun = colorRamp2(breaks = 0:p_max, col = colorsChoice(p_max + 1)),
legend_height = unit(3, "cm"), labels_gp = gpar(fontsize = 10),
title_gp = gpar(fontsize = 10), title_position = "topleft", title = paste0(title_second_data, "\n"), row_gap = unit(3, "mm"))
lgd_list_vertical <- packLegend(updown_legend)
lgd_list_vertical2 <- packLegend(category_legend, pvalue_legend)
draw(lgd_list_vertical, just = "center")
upViewport()
draw(lgd_list_vertical2, x = circle_size, just = "left")
應用場景與注意事項
1.適用場景:
可用于解析生物(wu)學(xue)機制,如揭(jie)示疾病、發育等過(guo)程的關鍵通路;注釋細(xi)胞亞群功能(neng),明確其(qi)特性;篩選生物(wu)標志物(wu);輔助藥(yao)物(wu)靶點(dian)發現(xian)與重定位;整合多組學(xue)數據及指導實(shi)驗驗證方向(xiang)等,助力生物(wu)醫學(xue)研究(jiu)。
2.可視化調整:
可根據研究重點調整顏色(se)(se)方案(如按(an)通(tong)路類別(bie)分組著(zhu)色(se)(se))、過濾低富集因子的條(tiao)(tiao)目(mu),或添加(jia)熱圖(tu)刻度條(tiao)(tiao)增強可讀性。
總 結
富集圈圖通過多維度信息的空間整合,為復雜的基因功能分析提供了直觀的解讀框架,助力研究者快速定位關鍵通路與核心基因,推動單細胞轉錄組數據的深度挖掘。繪制圖片或者復現代碼過程中,如果老師遇到疑惑,歡迎撥打我們的熱線電話或者聯系我們的駐地銷售。