R语言ggplot2绘制条形图无法显示计数标签及报错解决
问题根源
你的报错和标签不显示的核心原因非常明确:
- 从你贴的
asteroid数据集结构可以看到,原始数据是每行对应1颗小行星的观测记录,根本不存在名为count的列。 geom_bar()默认使用stat="count"统计变换,会自动按x轴类别计算频数,这个计数是ggplot绘图过程中内部生成的统计值,不是原始数据自带的字段。你直接在映射里写y=count、label=count时,程序会默认去原始数据里找叫count的列,找不到就会抛出你看到的aesthetics错误,和R把count识别为count()函数没有关系,你换成freq、Count这类名字,只要原数据里没有对应列、也没有指定用统计生成的值,一样会报错。
另外你第二段代码重复叠加了两次geom_bar()层,一次用默认计数统计、一次用stat="identity",属于冗余写法,会导致图形重复渲染。第一次代码里写的labels = TRUE是无效参数,ggplot的aes映射体系里没有这个配置项,写了也不会生效。
可行方案
两种写法都可以实现给条形图加计数标签的需求,不需要复杂调整:
方案1:直接调用统计变换生成的计数值(不需要提前处理数据)
用after_stat()明确告诉ggplot,你要引用的是统计过程中生成的计数值,而不是原始数据列,这是和你现有代码逻辑适配度最高的改法:
library(ggplot2) # 顶层映射只保留存在的变量,删掉无效的y=count、labels=TRUE p <- ggplot(asteroid, aes(x = class, fill = class)) p + geom_bar() + # geom_text指定和geom_bar一致的count统计,用after_stat取计数当标签 geom_text( aes(label = after_stat(count)), stat = "count", vjust = -0.3 # 把标签放在条形顶端上方,避免重叠 ) + ggtitle('Frequency of Hazardous and Non-Hazardous Asteroids by Class') + xlab('Class Based on Solar System Location') + labs(caption = '(*) indicates a potentially hazardous object') + scale_fill_discrete(labels = c('Amor*','Apollo','Apollo*','Aten','Aten*','Interior Earth Object*'))
方案2:提前汇总数据再绘图
如果不想记after_stat的规则,可以先把数据按类别汇总计数,再用专门给预汇总数据设计的geom_col()绘图:
library(dplyr) library(ggplot2) # 先按class分组统计频数 asteroid_sum <- asteroid %>% group_by(class) %>% summarise(count = n()) # 直接用汇总后的数据绘图 ggplot(asteroid_sum, aes(x = class, y = count, fill = class)) + geom_col() + geom_text(aes(label = count), vjust = -0.3) + ggtitle('Frequency of Hazardous and Non-Hazardous Asteroids by Class') + xlab('Class Based on Solar System Location') + labs(caption = '(*) indicates a potentially hazardous object') + scale_fill_discrete(labels = c('Amor*','Apollo','Apollo*','Aten','Aten*','Interior Earth Object*'))
内容的提问来源于stack exchange,提问作者Ariel
相关产品推荐
相关产品推荐

