R语言ggplot绘制分组图报hue palette取色错误求助
报错根因
这个报错的核心触发逻辑是:你传入fill映射的Age_cat变量没有有效枚举水平,ggplot的hue调色板需要为至少1个分组分配颜色,找不到有效分组时就会抛出该错误。具体到你的代码,问题出在两个环节:
- 手动分箱
Age_cat的逻辑有漏洞:你没有提前初始化Age_cat字段就直接对列的子集赋值,若数据集存在年龄不在18-110区间的样本、或者年龄字段本身有缺失值,就会导致Age_cat全部为NA、没有有效分组。 - 你之前用连续型的
Age字段做fill映射时,ggplot调用连续色阶不需要校验分组水平,所以不会触发该报错,换成分类变量后才会触发分组水平校验。
此外你的绘图代码还存在两个不影响本次报错、但会导致后续运行异常的隐患:直方图alpha参数设为4(透明度取值范围为0-1)、参数末尾多了多余逗号;密度图中ggtitle(labs(title = ...))是错误嵌套写法,ggtitle直接传入字符串即可。
解决步骤
1. 安全生成Age_cat分类变量
替换原来的手动分箱代码,用cut函数避免条件遗漏,同时先校验分组有效性:
# 用cut分箱,左开右闭规则下设置breaks下限为17,覆盖18岁样本 heart_disease$Age_cat <- cut(heart_disease$Age, breaks = c(17, 35, 55, 65, 110), labels = c("young adult", "middle adult", "older adult", "elderly adult"), include.lowest = TRUE) # 校验分组是否生成成功,能看到4个分组的样本数即为正常 table(heart_disease$Age_cat, useNA = "ifany") # 可选:如果存在Age_cat为NA的样本,过滤后再绘图 heart_disease <- heart_disease[!is.na(heart_disease$Age_cat), ]
2. 运行修正后的绘图代码
# 分组直方图 ggplot(heart_disease, aes(x = HeartDisease, fill = Age_cat)) + geom_histogram(colour = "black", binwidth = .1, lwd = .75, linetype = 1, position = "identity", alpha = 0.4) + labs(x = "HeartDisease", y = "Frequency", title = "Distribution of Heart Disease by Age") # 分组密度图 Densityplot <- ggplot(data = heart_disease, aes(x = HeartDisease, fill = Age_cat)) + geom_density(alpha = 0.7, cex = 1) + ggtitle("Distribution of Heart Disease by Age") + theme(text = element_text(size = 10)) Densityplot
内容的提问来源于stack exchange,提问作者lindslinds
相关产品推荐
相关产品推荐

