# 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()
聚类图改
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
推荐阅读更多精彩内容
- Movielens数据集+WEB+Canopy聚类+Kmeans聚类+协同过滤推荐+测评指标MAE实现 一、实现原...
- 该文章主要整理自珠穆拉玛峰的文章《从拉普拉斯矩阵说到谱聚类》,添加了少部分个人理解的文字和公式推导 该文章同步发表...
- Kmeans聚类算法实现(输出聚类过程,分布图展示) Kmeans聚类算法是聚类算法中最基础最常用的聚类算法,算法...
- 基于Kmeans+Canopy聚类的协同过滤算法代码实现(输出聚类计算过程,分布图展示) 聚类(Clusterin...