使用ggMarginal时如何自定义箱线图的尺寸与排序
解决方案
核心实现逻辑
两个需求都可以通过调整因子配置和ggMarginal传参实现:
- 排序统一:将分组字段
ID转为有序因子,手动指定和你要求的颜色顺序匹配的因子水平,ggplot和ggMarginal都会自动继承该排序,x、y轴的边际箱线图顺序会完全同步 - 箱线图宽度统一:一是向边际箱线图图层透传统一的
width参数,二是调整边际图和主图的占比,避免边际区域空间不足导致箱线图被挤压变形
另外你当前代码存在明显错误:ggMarginal的第一个入参需要传入你提前构建的ggplot对象,而不是原始数据集,否则边际图不会继承你自定义的颜色、分组配置。
完整调整后代码
library(ggplot2) library(ggExtra) # 第一步:将ID转为有序因子,levels按你要求的绿、黄、蓝、红、棕、紫对应的实际ID值填写 # 注意把下方levels参数里的占位值替换成你数据集里ID列的实际取值,顺序严格对应你要的展示顺序 my_data$ID <- factor(my_data$ID, levels = c("绿色对应ID值", "黄色对应ID值", "蓝色对应ID值", "红色对应ID值", "棕色对应ID值", "紫色对应ID值")) # 第二步:构建基础散点图 p <- ggplot(my_data, aes(x = O, y = H)) + geom_point(aes(color = ID, group = ID), size = 5) + # 自定义颜色映射,values顺序和因子水平顺序完全对应 scale_color_manual( name = "", values = c("green", "yellow", "blue", "red", "brown", "purple"), # 你原来的labels有重复的"s",如果是不同类别请调整避免冲突 labels = c("b", "d", "g", "o", "s1", "s2") ) + # 因为启用了groupFill,需要同步配置填充色映射 scale_fill_manual( name = "", values = c("green", "yellow", "blue", "red", "brown", "purple"), labels = c("b", "d", "g", "o", "s1", "s2") ) # 第三步:生成带边际箱线图的最终图表 ggMarginal( p, type = "boxplot", groupColour = TRUE, groupFill = TRUE, # 统一所有箱线图的自身宽度,可根据需求调整数值 width = 0.5, # 主图和边际图的占比,数值越大主图占比越高,可根据布局调整 size = 5 )
参数调整说明
如果箱线图还是存在宽度不一致的情况,可以适当调小width的数值,或者调小size的数值给边际图留出更多展示空间;如果需要调整颜色的具体色值,可以把values里的颜色名替换为十六进制色码,顺序保持和因子水平一致即可。
内容的提问来源于stack exchange,提问作者Ginevra
相关产品推荐
相关产品推荐

