如何在R语言中基于多TSV文件创建带密度曲线的重叠直方图
多TSV文件重叠直方图+密度曲线解决方案
直接上修改后的完整代码:
# 设置参数 lower_bound <- 0.001 upper_bound <- 5 # 获取当前目录下所有.tsv文件的完整路径 file_paths <- list.files(pattern = "\\.tsv$", full.names = TRUE) # 批量读取并预处理每个文件的数据 all_data <- lapply(file_paths, function(path) { # 读取TSV文件 df <- read.delim(path, sep = "\t") # 过滤Ks值在指定范围内的数据 df_filtered <- df[df$Ks < upper_bound & df$Ks > lower_bound, ] # 按Family和Node分组计算Ks的均值 dff <- aggregate(Ks ~ Family + Node, data = df_filtered, FUN = mean) # 生成对称的Ks数据 ks_values <- c(dff$Ks, -dff$Ks + lower_bound) # 返回带文件名标识的数据框,方便后续分组绘图 data.frame(ks = ks_values, file_name = basename(path)) }) # 将所有文件的数据合并到一个统一的数据框 combined_data <- do.call(rbind, all_data) # 初始化绘图画布:先绘制空的基础直方图(白色填充,无边界) hist(combined_data$ks, prob = TRUE, xlim = c(0, upper_bound), n = 50, col = "white", border = NA, main = "重叠Ks分布直方图与密度曲线", xlab = "Ks值", ylab = "密度") # 生成对应文件数量的颜色向量 colors <- rainbow(length(file_paths)) # 循环绘制每个文件的透明直方图和密度曲线 for (i in seq_along(file_paths)) { # 提取当前文件的数据集 current_data <- combined_data[combined_data$file_name == basename(file_paths[i]), ] # 绘制透明直方图(alpha.f控制透明度) hist(current_data$ks, prob = TRUE, xlim = c(0, upper_bound), n = 50, col = adjustcolor(colors[i], alpha.f = 0.3), border = NA, add = TRUE) # 计算密度并绘制曲线 dens <- density(current_data$ks, from = 0, to = upper_bound) lines(dens, col = colors[i], lwd = 2) } # 添加图例,区分不同文件的分布 legend("topright", legend = basename(file_paths), fill = adjustcolor(colors, alpha.f = 0.3), border = NA, lty = 1, col = colors, lwd = 2, cex = 0.8)
关键改动说明
- 多文件批量处理:用
list.files自动抓取所有TSV文件,lapply循环处理每个文件,同时给每条数据标记文件名,实现分组依据。 - 分层叠加绘图:先绘制空的基础画布,再通过
add=TRUE逐个叠加不同文件的直方图和曲线,避免初始绘图覆盖后续内容。 - 透明化与颜色区分:用
adjustcolor给直方图设置透明度,rainbow生成差异化颜色,解决单一纯色问题,同时保证重叠部分可见。
内容的提问来源于stack exchange,提问作者Ardy Kharabian
相关产品推荐
相关产品推荐

