R语言ggplot2对比箱线图统一配色与双列图例实现方法问询
ggplot2 两类数据对比箱线图自定义实现
核心需求梳理
- 配色规则:同算法对应的真实观测、模拟数据箱线使用完全相同的填充色,共5种算法对应5种填充色,仅模拟数据箱线设置
alpha=0.2半透明效果 - 图例规则:图例采用双列布局,一列展示真实数据的算法标签,另一列展示带
s前缀标识的模拟数据算法标签
原代码问题说明
原代码直接给两个箱线图层映射同一个algo字段作为填充依据,会导致两类数据的图例自动合并,无法拆分出带s前缀的模拟数据标签,也没法单独控制模拟数据的透明度不影响真实数据图层。
可直接运行的修正代码
library(ggplot2) # 预处理:给模拟数据的算法名加s前缀,和真实数据标签做区分 simulation$algo_label <- paste0("s", simulation$algo) # 配置5种固定填充色,沿用原代码使用的YlGnBu色系,可按需替换色值 base_colors <- RColorBrewer::brewer.pal(5, "YlGnBu") real_algo <- unique(ADCF2param_shuffle$algo) names(base_colors) <- real_algo sim_colors <- base_colors names(sim_colors) <- paste0("s", real_algo) all_colors <- c(base_colors, sim_colors) p <- ggplot() + # 模拟数据箱线层:单独设置0.2透明度,映射带s前缀的标签 geom_boxplot( data = simulation, aes(x = param, y = data, fill = algo_label), alpha = 0.2 ) + # 真实数据箱线层:不设透明度,映射原算法标签 geom_boxplot( data = ADCF2param_shuffle, aes(x = param, y = data, fill = algo) ) + # 原有红色标记点保持原有设置不变 geom_point( data = gt_vs_fitted, aes(x = param, y = data), color = "red", size = 4, shape = 18 ) + # 应用统一配色 scale_fill_manual(values = all_colors) + # 设置图例为双列布局,按列排列实现真实、模拟数据各占一列 guides(fill = guide_legend(ncol = 2, byrow = FALSE)) + theme_classic() + labs(y = "CCC", x = "Parameters") print(p)
补充调整说明
如果需要手动调整图例的标签排列顺序,只需要在scale_fill_manual中传入breaks参数,按你想要的展示顺序传入所有真实、模拟数据的标签名即可。
内容的提问来源于stack exchange,提问作者Carlos Macarro
相关产品推荐
相关产品推荐

