基于不同seed的多DataFrame同列箱线图绘制需求
解决方案:多DataFrame分组箱线图绘制
1. 数据合并与格式转换
先把5个seed的DataFrame合并,加上seed列标记来源,再转成长格式适配绘图需求:
# 加载必备工具包 library(tidyverse) # 将所有seed的DataFrame放入列表,自动添加seed标识后合并 df_list <- list(seed1 = seed1, seed2 = seed2, seed3 = seed3, seed4 = seed4, seed5 = seed5) combined_df <- bind_rows(df_list, .id = "seed") # 提取目标列并转成长格式,拆分列名为类型和模型后缀 long_df <- combined_df %>% select(seed, starts_with(c("cr", "pd", "st_po"))) %>% pivot_longer( cols = -seed, names_to = c("type", "model"), names_pattern = "(cr|pd|st_po)_(.*)" )
2. 绘制分组箱线图
用ggplot2实现3组箱线图布局:每组对应一类列(cr/pd/st_po),每组内每行对应一个DataFrame,每个模型用不同颜色区分:
ggplot(long_df, aes(x = model, y = value, fill = model)) + # 按seed分行、type分列,y轴自由缩放适配不同分数范围 facet_grid(seed ~ type, scales = "free_y") + geom_boxplot(show.legend = FALSE) + # 设置标签和主题 labs(x = "模型变体", y = "预测分数") + theme_bw() + theme( strip.text.y = element_text(angle = 0), # seed标签横向显示更清晰 axis.text.x = element_text(angle = 45, hjust = 1) # x轴标签倾斜避免重叠 )
关键逻辑说明
bind_rows(.id = "seed"):批量合并DataFrame时自动添加来源标识,不用手动逐个处理pivot_longer:把宽格式数据转成ggplot偏好的长格式,通过正则表达式拆分列名,自动区分数据类型和模型变体facet_grid(seed ~ type):精准实现“每行一个seed,每类列一组图”的布局scales = "free_y":不同类型的预测分数范围差异可能较大,自由缩放y轴能更清晰展示分布
示例数据测试
如果用你提供的示例数据(假设为seed1),可以快速模拟其他seed的数据集验证效果:
set.seed(123) # 给示例数据添加小噪声生成其他seed的DataFrame seed2 <- seed1 %>% mutate(across(starts_with(c("cr", "pd", "st_po")), ~ . + rnorm(n(), 0, 0.02))) seed3 <- seed1 %>% mutate(across(starts_with(c("cr", "pd", "st_po")), ~ . + rnorm(n(), 0, 0.02))) seed4 <- seed1 %>% mutate(across(starts_with(c("cr", "pd", "st_po")), ~ . + rnorm(n(), 0, 0.02))) seed5 <- seed1 %>% mutate(across(starts_with(c("cr", "pd", "st_po")), ~ . + rnorm(n(), 0, 0.02))) # 执行前面的合并和绘图代码即可生成目标箱线图
内容的提问来源于stack exchange,提问作者Programming Noob
相关产品推荐
相关产品推荐

