聚类图改

# 1. 安装并加载依赖包
if (!requireNamespace("pheatmap", quietly = TRUE)) {
  install.packages("pheatmap")
}
if (!requireNamespace("RColorBrewer", quietly = TRUE)) {
  install.packages("RColorBrewer")
}
library(pheatmap)
library(RColorBrewer)

setwd("D:\\科研助理工作\\data\\25-nian\\9月\\9月8\\All-R-lines对比\\All-R-lines对比\\作图的数据\\test\\ZA1")


raw_data <- read.table (
  "ZA1-CDR22-G.txt",
  header = TRUE,
  stringsAsFactors = TRUE, # 按用户原始参数保留
  fill = TRUE,
  na.strings = c ("","NA"),
  check.names = FALSE # 关键:禁止 R 自动修改表头(如替换括号为.)
)



sample_info <- data.frame(
  Sample_ID = raw_data[, 3],
  Resistance = ifelse(raw_data[, 2] == "R", 1, 0),
  check.names = FALSE  # 不修改数据框列名,保留原始格式
)
sample_info



# 提取标记基因型(第4列及以后),**不清理括号及特殊字符**
marker_geno <- raw_data[, 4:ncol(raw_data), drop = FALSE]
# 仅移除可能导致R列名错误的极端字符(保留括号、空格等)
colnames(marker_geno) <- gsub("[^A-Za-z0-9\\.\\(\\)\\_\\-\\s]", "", colnames(marker_geno))
# 上述正则表达式明确保留:字母、数字、点、括号、下划线、减号、空格


# 3. 核心数据提取与处理
## 3.1 提取基础信息(样本ID、抗性)
sample_info <- data.frame(
  Sample_ID = raw_data[, 3],  # 第3列=样本ID(如H250、H251)
  Resistance = ifelse(raw_data[, 2] == "R", 1, 0),  # 第2列=抗性(R→1,S→0)
  check.names = FALSE
)

sample_info
## 3.2 提取标记基因型(第4列以后所有列,支持任意数量标记)
marker_geno <- raw_data[, 4:ncol(raw_data), drop = FALSE]  # 动态获取所有标记列
# 修改:只去除可能引起问题的特殊字符,保留括号
marker_geno

colnames(marker_geno) <- gsub("[^A-Za-z0-9\\.\\(\\)]", "", colnames(marker_geno))  # 保留括号
marker_geno

## 3.3 计算每个样本的基因型总和(所有标记基因型值累加,忽略NA)
# 先将基因型转换为数值型(防止字符型导致计算错误)

rownames(marker_geno) <- sample_info$Sample_ID  # 样本ID作为行名

# 计算总和(新增列:样本基因型总和)
sample_info$Total_Geno <- rowSums(marker_geno_numeric, na.rm = TRUE)  # na.rm=TRUE忽略空值
sample_info$Total_Geno

# 4. 准备热图输入数据与注释
## 4.1 热图矩阵(行=样本,列=标记)
heatmap_matrix <- marker_geno[!duplicated(rownames(marker_geno)), ]  # 去重样本

## 4.2 行注释(包含:抗性+样本基因型总和,便于图中直观查看)
# 修改:将Total_Geno转换为带数值的因子,以便在注释中显示具体数值
row_annotation <- data.frame(
  Resistance = factor(
    sample_info$Resistance[match(rownames(heatmap_matrix), sample_info$Sample_ID)],
    levels = c(0, 1), labels = c("S", "R")  # 显示S/R而非0/1,更易读
  ),
  Total_Geno = sample_info$Total_Geno[match(rownames(heatmap_matrix), sample_info$Sample_ID)],
  row.names = rownames(heatmap_matrix),
  check.names = FALSE
)
row_annotation
## 4.3 注释颜色配置(抗性:绿=S,红=R;总和:渐变色)
annotation_colors <- list(
  Resistance = c("S" = "#2E8B57", "R" = "#DC143C"),  # 抗性颜色
  Total_Geno = colorRampPalette(c("#E6F3FF", "#1E90FF"))(10)  # 总和渐变色(浅蓝→深蓝)
)

# 5. 绘制热图(含标记聚类+样本总和注释)
pdf(
  "genotype_heatmap_with_clustering12.pdf", 
  width = 12 + ncol(heatmap_matrix)*0.2,  # 宽度随标记数量自适应
  height = 8 + nrow(heatmap_matrix)*0.1    # 高度随样本数量自适应
)

pheatmap(
  mat = heatmap_matrix,
  color = colorRampPalette(brewer.pal(9, "Blues"))(100),  # 基因型颜色(浅蓝→深蓝)
  gaps_col          = c(6, 8),
  cutree_rows        = 3,
  cutree_cols        = 3,
  border_color      = F,
  show_colnames     = TRUE,
  show_rownames     = TRUE,
  drop_levels       = TRUE,
  fontsize          = 9,
  scale             = "none",
  
  annotation_row = row_annotation,  # 行注释(抗性+总和)
  annotation_colors = annotation_colors,  # 注释颜色
  cluster_rows = TRUE,  # 样本聚类
  cluster_cols = TRUE,  # 标记间聚类
  treeheight_row = 15,  # 样本树状图高度
  treeheight_col = 15,  # 标记树状图高度
#  main = "Genotype Heatmap (Markers Clustered + Sample Total)",  # 图标题
  legend_breaks = c(1,0.5,0,-1),

  fontsize_row = 7,     # 样本ID字体大小
  fontsize_col = 9,     # 标记名字体大小
  fontsize_annotation = 8,  # 注释字体大小
  display_numbers = FALSE,  # 若需显示基因型数值,可设为TRUE
  number_format = "%.0f",   # 数值格式(整数)
  #border_color = NA,        # 修改:去掉边框(原"gray90")
  # 添加:在注释中显示Total_Geno的数值
  annotation_legend = TRUE
)

# 如果需要更突出显示Total_Geno数值,可以考虑添加文本标注
# 这里使用grid.text手动添加数值标签
library(grid)
library(gridExtra)

# 获取热图的布局信息来定位标注位置
# 这部分代码会在热图绘制后添加数值标签
grid.ls()  # 查看所有grobs名称
# 根据实际grobs名称调整以下代码
# 注意:这部分可能需要根据实际绘图结果微调位置参数

dev.off()

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容