如何为带分面的ggplot实现指定变量的条件填充美学
调整特定组的填充样式
要给一等舱儿童(First=1且Age="Child")设置特殊填充样式,有两种实用方法:
方法1:通过条件映射区分目标组
直接在aes(fill=...)中加入条件判断,将目标组与其他组做区分,再通过颜色刻度自定义样式:
library(tidyverse) dframe <- as.data.frame(Titanic) dframe$First <- ifelse(dframe$Class=="1st",1,0) dframe %>% ggplot(aes(Class, Sex))+ # 用ifelse标记目标组,其余保留原Freq映射 geom_point(aes(size = Freq, fill = ifelse(First == 1 & Age == "Child", "一等舱儿童", as.character(Freq))), pch = 21)+ # 自定义填充颜色:给目标组设置特殊色,其余用渐变 scale_fill_manual( values = c( scales::viridis_pal()(length(unique(dframe$Freq))), "一等舱儿童" = "red" ), breaks = c(as.character(unique(dframe$Freq)), "一等舱儿童"), labels = c(unique(dframe$Freq), "一等舱儿童") )+ guides(size = guide_legend(reverse = TRUE))+ facet_grid(Survived~Age)+ theme_bw()+ labs(x = "舱位等级", y = "性别", fill = "人数/分组")
方法2:分层绘制突出目标组
先绘制所有普通点,再单独添加一层仅针对一等舱儿童的点,设置专属填充:
library(tidyverse) dframe <- as.data.frame(Titanic) dframe$First <- ifelse(dframe$Class=="1st",1,0) dframe %>% ggplot(aes(Class, Sex))+ # 绘制所有点,fill绑定Freq geom_point(aes(size = Freq, fill = Freq), pch = 21)+ # 单独绘制一等舱儿童,设置特殊填充 geom_point(data = filter(dframe, First == 1 & Age == "Child"), aes(size = Freq), pch = 21, fill = "red")+ guides(fill = guide_legend(reverse = TRUE, override.aes = list(alpha = 1)))+ guides(size = guide_legend(reverse = TRUE))+ facet_grid(Survived~Age)+ theme_bw()+ labs(x = "舱位等级", y = "性别")
说明
- 方法1适合需要将目标组纳入统一图例的场景,能清晰展示特殊分组;
- 方法2更简洁,适合仅需视觉突出目标组、无需在图例单独标注的场景。
内容的提问来源于stack exchange,提问作者YefR
相关产品推荐
相关产品推荐

