CircosHeatmap-aardio/res/heatmap_script.R
2025-01-12 00:52:51 +08:00

109 lines
3.3 KiB
R

# Load required packages
suppressPackageStartupMessages(library(grid))
suppressPackageStartupMessages(library(ComplexHeatmap))
suppressPackageStartupMessages(library(circlize))
suppressPackageStartupMessages(library(RColorBrewer))
suppressPackageStartupMessages(library(dendextend))
suppressPackageStartupMessages(library(dendsort))
suppressPackageStartupMessages(library(gridBase))
# Get arguments from the command line
args=commandArgs(T);
# Check the number of arguments
if (length(args) != 2) {
stop("Please provide two arguments: the input CSV file path and the output PDF file path.", call. = FALSE)
}
# Get the input CSV file path and the output PDF file path
input_csv <- args[1]
output_pdf <- args[2]
# Check if the input file exists
if (!file.exists(input_csv)) {
stop("The input file does not exist. Please check the file path.", call. = FALSE)
}
# Load the data for plotting
data <- read.table(file = input_csv, header = TRUE, row.names = 1, sep = ',')
# View the data
message("Data loaded successfully. The first few rows are as follows:")
print(head(data))
# Convert to matrix format and normalize the data
data <- as.matrix(data)
cir1 <- t(scale(t(data)))
# Handle NA values
cir1[is.na(cir1)] <- 0
# View the normalized data
message("Data normalization successful. The first few rows are as follows:")
print(head(cir1))
# Define the color gradient for the heatmap
mycol <- colorRamp2(c(-2.5, 0.3, 3.1), c("blue", "white", "red"))
# Open the PDF device
pdf(output_pdf, width = 10, height = 8)
# Draw the basic circular heatmap
message("Drawing the basic circular heatmap...")
circos.heatmap(cir1, col = mycol)
circos.clear()
# Adjust and beautify the circular heatmap in circos.heatmap()
message("Drawing the adjusted and beautified circular heatmap...")
circos.par(gap.after = c(30))
circos.heatmap(cir1, col = mycol,
dend.side = "inside",
rownames.side = "outside",
rownames.col = "black",
rownames.cex = 1.2,
rownames.font = 1.2,
bg.border = "black",
cluster = TRUE)
circos.clear()
# Adjust and beautify the dendrogram
message("Drawing the circular heatmap with adjusted and beautified dendrogram...")
circos.par(gap.after = c(30))
circos.heatmap(cir1, col = mycol, dend.side = "inside",
rownames.side = "outside",
track.height = 0.28,
rownames.col = "black",
rownames.cex = 1.3,
rownames.font = 1.3,
cluster = TRUE,
dend.track.height = 0.18,
dend.callback = function(dend, m, si) {
color_branches(dend, k = 15, col = 1:15)
})
circos.clear()
# Add legend labels
message("Adding legend labels...")
lg <- Legend(title = "Exp", col_fun = mycol,
direction = c("vertical"))
grid.draw(lg)
# Add column names
message("Adding column names...")
circos.track(track.index = get.current.track.index(), panel.fun = function(x, y) {
if (CELL_META$sector.numeric.index == 1) {
cn <- colnames(cir1)
n <- length(cn)
circos.text(rep(CELL_META$cell.xlim[2], n) + convert_x(0.5, "mm"),
1:n + 5,
cn, cex = 0.6, adj = c(0, 0.5), facing = "inside")
}
}, bg.border = NA)
circos.clear()
# Close the PDF device
dev.off()
message("The heatmap has been successfully saved to: ", output_pdf)