如何在x轴为分类变量的ggplot中添加自定义文本?
问题修正:ggplot添加自定义文本时出现'object not found'错误
错误原因
你的代码中,ggplot()的全局映射里包含了fill = name,而geom_text使用的新数据框中没有name列,但它默认会继承全局的所有映射,因此会报错找不到name对象。
修正方案
有两种简单的解决方式:
方式1:阻止geom_text继承全局映射
给geom_text添加inherit.aes = FALSE参数,让它仅使用自身定义的映射:
library(ggplot2) data = rbind(data.frame('val' = c(10, 30, 15), 'name' = c('A', 'B', 'C'), group = 'gr1'), data.frame('val' = c(30, 40, 12), 'name' = c('A', 'B', 'C'), group = 'gr2'), data.frame('val' = c(10, 30, 15), 'name' = c('A', 'B', 'C'), group = 'gr3')) ggplot(data, aes(x = group, y = val, fill = name)) + geom_bar(stat = "identity", position = "stack", width = .1) + geom_text(data = data.frame('group' = c('gr1', 'gr2', 'gr3'), 'label' = c('X', 'Y', 'Z')), mapping = aes(x = group, y = 40, label = label), inherit.aes = FALSE)
方式2:覆盖全局的fill映射
在geom_text的aes中显式设置fill = NULL,取消对全局fill映射的继承:
library(ggplot2) data = rbind(data.frame('val' = c(10, 30, 15), 'name' = c('A', 'B', 'C'), group = 'gr1'), data.frame('val' = c(30, 40, 12), 'name' = c('A', 'B', 'C'), group = 'gr2'), data.frame('val' = c(10, 30, 15), 'name' = c('A', 'B', 'C'), group = 'gr3')) ggplot(data, aes(x = group, y = val, fill = name)) + geom_bar(stat = "identity", position = "stack", width = .1) + geom_text(data = data.frame('group' = c('gr1', 'gr2', 'gr3'), 'label' = c('X', 'Y', 'Z')), mapping = aes(x = group, y = 40, label = label, fill = NULL))
两种方法都能解决报错问题,其中第一种方式更直观,适合不需要继承任何全局映射的场景。
内容的提问来源于stack exchange,提问作者Brian Smith
相关产品推荐
相关产品推荐

