我有多個檔案要繪制為火山圖。我所有的檔案都在檔案夾中。
目標我想將它們作為檔案串列讀取,然后將它們傳遞給函式以繪制每個資料或檔案。
我想使用的功能是這個
EnhancedVolcano(res1,lab = rownames(res1),x = "log2FoldChange",y = "padj",
#selectLab = c("APOBEC3B","CHD7","AURKB","EYA1","UHRF1","SFMBT1"),
xlim = c(-8, 8),
xlab = bquote(~Log[2]~ "fold change"),
ylab = bquote(~-Log[10]~adjusted~italic(P)),
transcriptPointSize = 10,
transcriptLabSize = 10,
border = "full",
pCutoff = 0.05,
#legendPosition = "bottom",
borderWidth = 1.5,
legend=c('NS','Log2 FC','Adjusted p-value',
'Adjusted p-value & Log2 FC'),
legendPosition = 'bottom',
legendLabSize = 20,
legendIconSize = 20,
borderColour = "blue",
#drawConnectors = FALSE,
#widthConnectors = 0.01,
colConnectors = 'grey30',
gridlines.major = FALSE,
gridlines.minor = FALSE)
這是我打算使用的檔案串列
M0_vs_M1_TCGA_stages.txt M0_vs_M4_TCGA_stages.txt M1_vs_M3_TCGA_stages.txt M2_vs_M3_TCGA_stages.txt M3_vs_M4_TCGA_stages.txt
M0_vs_M2_TCGA_stages.txt M0_vs_M5_TCGA_stages.txt M1_vs_M4_TCGA_stages.txt M2_vs_M4_TCGA_stages.txt M3_vs_M5_TCGA_stages.txt
M0_vs_M3_TCGA_stages.txt M1_vs_M2_TCGA_stages.txt M1_vs_M5_TCGA_stages.txt M2_vs_M5_TCGA_stages.txt M4_vs_M5_TCGA_stages.txt
我的每個資料框的一般結構是這樣的
a <- dput(head(M0_vs_M1_TCGA_stages))
structure(list(gene = c("ENSG00000000003", "ENSG00000000971",
"ENSG00000002726", "ENSG00000003989", "ENSG00000005381", "ENSG00000006534"
), Symbol = c("TSPAN6", "CFH", "AOC1", "SLC7A2", "MPO", "ALDH3B1"
), baseMean = c(18.692748982067, 464.265236194545, 109.22179823167,
85.504528879087, 225281.306485184, 3135.38237206618), log2FoldChange = c(1.72011856334064,
-1.84102137729838, -1.90294968540377, -2.38723703218791, -4.71693379158602,
-1.50626419101949), lfcSE = c(0.521825206121688, 0.528072294508922,
0.539428712863011, 0.661673608593429, 0.523148071429431, 0.26205630469554
), stat = c(3.29635008650678, -3.48630556164743, -3.52771300456717,
-3.60787705778782, -9.0164411362497, -5.74786472994606), pvalue = c(0.00097949874464195,
0.00048974125782849, 0.00041916635977159, 0.00030871270363637,
1.94298755192739e-19, 9.03774951656819e-09), padj = c(0.0133044251543343,
0.00833058768185816, 0.00750903801425802, 0.00609902023132708,
3.7330619835181e-15, 3.94641548776874e-06), UP_DOWN = c("UP",
"DOWN", "DOWN", "DOWN", "Low", "DOWN")), row.names = c(NA, -6L
), class = c("tbl_df", "tbl", "data.frame"))
因此,對于每個檔案或每個資料集,我想將它們傳遞給上述函式并將它們列印為單獨的圖,并保留圖中的名稱,但除外。
任何建議或幫助我都會非常感激。
到目前為止我的嘗試
make_volcano <- function(df){
ggmaplot(df, main = expression("Group 1" %->% "Group 2"),
fdr = 0.05, fc = 1, size = 0.4,
palette = c("#B31B21", "#1465AC", "darkgray"),
genenames = as.vector(df$Symbol),
legend = "top", top = 0,
font.label = c("bold", 11),
font.legend = "bold",
font.main = "bold",
ggtheme = ggplot2::theme_minimal())
}
plots <- lapply(all_csv, make_volcano)
這可以滿足我的需要,它并沒有那么復雜,我需要弄清楚如何使用相應的檔案名保存繪圖
我的答案的改進版本
bb <- all_csv
plot_list = list()
for (i in seq(length(bb))) {
p = make_volcano(bb[[i]])
plot_list[[i]] = p
}
pdf("MAPLOT.pdf",height = 10,width = 15)
for (i in seq(length(bb))) {
print(plot_list[[i]])
}
dev.off()
我只需要添加將每個串列元素名稱放入圖中以便識別,盡管它們是按順序繪制的
uj5u.com熱心網友回復:
我不在我的電腦上,也沒有可用的 R,因此這個答案更籠統,應該只是給出一個原理的概念。
您似乎已經解決了讀取檔案串列的問題,并且已經有了資料集串列。你有你的繪圖功能。做得好。
我個人更喜歡回圈的“應用”系列,因為它的代碼稍微短一些,我發現它更容易閱讀,而且“增加你的向量”的危險也更少(即沒有)。(另見 Burn 著名的 R inferno,第 2 章)。
在你的情況下,你可以簡單地寫
## lapply returns a list
lapply(all_csv, make_volcano)
這將創建地塊串列。您現在有幾個選項來保存它們。您可以將它們列印在一個圖上,使用拼湊包最簡單:
plots <- lapply(all_csv, make_volcano)
patchwork::wrap_plots(plots)
如果您想創建單獨的檔案,您的方法非常好。另一種選擇可能是使用 ggsave,這里再次使用 lapply。您可以在 lapply 本身中指定引數。
lapply(plots, ggsave, width = 15, device = "pdf")
命名有點棘手,當然很大程度上取決于資料集串列的結構。它是一個命名串列嗎?打電話時得到什么names(all_csv)?
您可以使用標題的名稱,如此執行緒中所示。這也不是該主題的唯一主題,它實際上是 stackoverflow 上一個非常普遍的問題。一般的想法是回圈遍歷串列和名稱,并將各自的名稱分配給繪圖 - 這可以通過索引或使用并行回圈函式(例如mapply或)來實作purrr::map2。我通常喜歡在這些情況下回圈索引。例如,您可以這樣做:
lapply(1:length(all_csv), function(i){
make_volcano(all_csv[[i]]
## I am here assuming that ggmaplot returns a ggplot object to which you can add a
## ggtitle layer - not sure if this really works. But hopefully you get the idea
ggtitle(names(all_csv)[i])
})
回圈遍歷您的名稱索引的相同想法應該適用于ggsave,并且您將獲得類似于讀入資料檔案的檔案名。
lapply(1: length(plots), function(i){
ggsave(plot = plots[[i]],
filename = paste(names(plots)[i], ".pdf"),
width = 15)
})
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/488012.html
