# 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)