ggplot2添加年度索赔总额文本报错:bands2对象未找到
问题解决:geom_text报错"object 'bands2' not found"
错误原因
你在ggplot的全局美学映射里设置了fill = bands2, color = bands2,但第二个geom_text使用的yearly_totals数据集里并没有bands2这一列。由于geom_text默认会继承全局的美学映射,程序试图在yearly_totals里查找bands2,自然找不到就报错了。
修复方案
有两种简单的修复方式:
方案1:禁用美学继承
给第二个geom_text添加inherit.aes = FALSE参数,让它不继承全局的fill和color映射:
yearly_totals <- df_claims %>% group_by(AccidentYear) %>% summarise(total = n()) gg_df_claims <- df_claims %>% ggplot(aes(AccidentYear, fill = bands2, color = bands2)) + geom_bar(position = position_stack(reverse = TRUE), stat = "count") + geom_text( aes(label = after_stat(count), y = after_stat(count)), stat = "count", position = position_stack(reverse = TRUE, vjust = 0.5), size = 2, color = "white" ) + geom_text( data = yearly_totals, aes(label = total, y = total), inherit.aes = FALSE, # 关键:禁用全局美学继承 position = position_nudge(y = 0.3), # 可选:调整位置避免和柱子文本重叠 size = 2, color = "black", fontface = "bold" ) + scale_fill_manual(values = v_greens, labels = labels2) + scale_color_manual(values = v_greens) + xlab(NULL) + ylab("Count of Claims") + theme_pubclean() + theme( panel.grid.major.y = element_line(color = "gray", linetype = "dashed"), panel.grid.minor.y = element_blank() )
方案2:覆盖全局美学映射
在第二个geom_text的aes里显式设置fill和color为NULL,覆盖全局的映射:
# ... 前面代码保持不变 geom_text( data = yearly_totals, aes(label = total, y = total, fill = NULL, color = NULL), # 覆盖全局美学 position = position_nudge(y = 0.3), size = 2, color = "black", fontface = "bold" ) # ... 后面代码保持不变
额外提示
建议给年度总额文本添加position_nudge(y = 0.3)这类位置调整,避免和柱子顶部的小计文本重叠,让图表可读性更强。
内容的提问来源于stack exchange,提问作者Florian
相关产品推荐
相关产品推荐

