ggplot循环绘制箱线图:如何为不同处理组更改点样式
解决ggplot箱线图自定义点样式不生效的问题
问题出在没有为点的形状指定变量映射,同时未将point_4_v2加入绘图流程。按以下步骤修改即可:
1. 保留已定义的颜色和形状配置
你的color_4和point_4_v2定义是正确的,无需修改:
color_4 <- list(scale_color_manual( values = c("gray60", "midnightblue", "steelblue2", "dodgerblue3"), name = "Treatment", labels = c("Control", "Metformin", "Met Early", "Met Late") )) point_4_v2 <- list(scale_shape_manual( values = c(23, 22, 21, 24), name = "Treatment", labels = c("Control", "Metformin", "Met Early", "Met Late") ))
2. 修改循环中的绘图代码
需要在ggplot的美学映射(aes)中添加shape = Rx,让ggplot知道要按Rx分组区分点样式;同时将point_4_v2加入到绘图图层中:
variables <- met_df %>% select(28, 30:34, 38:62, 93:101, 103:106, 112:114, 140:168, 172:184, 190:202, 208:216, 219:224, 226:236, 238:245, 267:275,278 ,334 , 341, 344:347, 358:365, 474:516) %>% names() for(i in variables) { # 在aes中添加shape = Rx,绑定形状与处理组的映射 g <- ggplot(met_df, aes(x = Rx, y = get(i), color= Rx, shape = Rx)) + geom_boxplot(outlier.shape=NA)+ ylab(i) # 加入point_4_v2配置 print(g + theme_classic()+ geom_jitter(position=position_jitter(0.2))+ color_4 + point_4_v2) }
关键说明
- 之前
scale_shape_manual不生效,是因为没有在aes中声明shape与Rx的关联,ggplot不知道要基于哪个变量应用形状规则。 - 如果只想让
geom_jitter的点区分形状,也可以不在全局aes中定义,而是单独在geom_jitter里指定:
这种方式下,全局geom_jitter(aes(shape = Rx), position=position_jitter(0.2))aes可以保留原来的color=Rx,无需添加shape=Rx。
内容的提问来源于stack exchange,提问作者KCS
相关产品推荐
相关产品推荐

