如何在分面发散条形图上添加各条形的观测数量文本?
解决方案:在分面发散条形图中显示观测数量
步骤1:补充数据预处理,计算分组观测数量
原预处理未统计各品牌-驱动类型组合的观测数,需先添加分组计数逻辑:
library(tidyverse) # 读取数据集 EV <- read_csv("evdataset.csv") # 计算标准化续航值 EV$range_norm <- round((EV$ElectricRange - mean(EV$ElectricRange))/sd(EV$ElectricRange),2) # 标记续航高于/低于均值 EV$range_type <- ifelse(EV$range_norm > 0, "above", "below") # 按品牌、驱动类型分组统计观测数量,同时保留排序逻辑 EV_count <- EV %>% group_by(Make, Drive, range_type, range_norm) %>% summarise(count = n(), .groups = "drop") %>% arrange(range_norm) # 将品牌转为有序因子,维持基于range_norm的排序 EV_count$Make <- factor(EV_count$Make, levels = unique(EV_count$Make))
步骤2:修改绘图代码,替换标签为观测数量
将label参数替换为统计得到的count,并通过hjust调整文本位置,避免被条形遮挡:
ggplot(EV_count, aes(x = Make, y = range_norm, label = count)) + geom_bar(stat = 'identity', aes(fill = range_type)) + # 根据续航正负调整文本位置:正数值放条形右侧,负数值放左侧 geom_text(aes(hjust = ifelse(range_norm > 0, -0.1, 1.1)), size = 3.5) + facet_wrap(vars(as.factor(Drive))) + coord_flip() + labs(x = "品牌", y = "标准化续航", fill = "续航水平") + theme_bw()
关键注意点
- 必须按
Make+Drive分组计数:原数据单品牌下可能对应多个车型(多行数据),需聚合后才能得到每个条形对应的观测数量 - 文本位置调整:通过
hjust参数让文本显示在条形外侧,避免被条形本身遮挡 - 保留原排序逻辑:维持品牌基于
range_norm的排序规则,保证图表结构和需求一致
内容的提问来源于stack exchange,提问作者user20392478
相关产品推荐
相关产品推荐

