如何使用list函数处理带label的dataframe,解决ggplot2绘图报错问题
修复方案
报错原因
原代码有两处逻辑和你的数据结构不匹配:
set_names(c("S", "M", "E"))设置错误:S/M/E是你数据中label列的分类值,三个输入数据集分别对应dN、dS、Omega三个指标,应该用指标名命名数据集pivot_longer(-df)操作错误:直接将除来源标识外的所有列转成长表,会把数值型的指标列和字符型的label列强制合并,两类数据类型不一致,因此触发类型合并报错
修正后可运行代码
library(tidyverse) list(all_dN, all_dS, all_omega) %>% # 给三个数据集命名为对应的指标名,用于后续分面 set_names(c("dN", "dS", "Omega")) %>% # 合并数据集时统一数值列名称,避免多列判断 map_dfr(function(df) { colnames(df)[1] <- "value" return(df) }, .id = "metric") %>% ggplot(aes(x = label, y = value, fill = label)) + geom_boxplot( alpha = 0.2, notch = TRUE, notchwidth = 0.8 ) + # 横向分面展示三个指标,和原有multiplot(cols=3)效果一致 facet_wrap(~metric, nrow = 1, scales = "free_y") + # 自定义三种label对应的填充色,可自行修改色值 scale_fill_manual(values = c("S" = "#1f77b4", "M" = "#ff7f0e", "E" = "#2ca02c")) + labs(x = "分类标签", y = "指标数值") + theme_bw()
调整说明
- 修正后的代码跳过了错误的全列转长操作,先统一每个数据集的数值列名称,避免类型冲突
- 保留
label作为x轴分类,自动对应三种不同的填充颜色,符合你的可视化要求 - 分面添加了
scales = "free_y"参数,适配三个指标不同的数值范围,避免小数值的箱线图被压缩
内容的提问来源于stack exchange,提问作者Someone_1313
相关产品推荐
相关产品推荐

