双轴分组条形图绘制异常求助:轴值错误与重复标签
双轴分组条形图修正方案
原问题核心问题
当前代码存在三个关键错误:
- 未对原始数据按商品和指标聚合,导致同一商品的同一指标存在多条记录,条形图实际叠加显示,标签重复出现
- 缩放比例不匹配:
Quantite乘1000,但右侧轴设置为除以100,数值对应关系完全错误 - 条形顶部显示缩放后的值,而非原始指标数值
修正步骤与完整代码
1. 先聚合数据
按Article分组,计算Quantite和PrixTotalAvecRabais的总和,确保每个商品的每个指标仅保留一个数据点:
2. 动态计算缩放因子
用两个指标的最大值比例计算缩放因子,让Quantite缩放后与PrixTotalAvecRabais的数值范围对齐:
3. 调整绘图细节
修正轴的缩放关系,让条形顶部显示原始数值,同时调整标签位置避免重叠。
library(ggplot2) library(tidyr) library(dplyr) # 聚合数据:按商品分组求和 DF_agg <- DF %>% group_by(Article) %>% summarize( Quantite = sum(Quantite, na.rm = TRUE), PrixTotalAvecRabais = sum(PrixTotalAvecRabais, na.rm = TRUE) ) %>% pivot_longer(cols = -Article, names_to = "Type") # 计算动态缩放因子:让数量和销售额的数值范围匹配 scale_factor <- max(DF_agg$value[DF_agg$Type == "PrixTotalAvecRabais"]) / max(DF_agg$value[DF_agg$Type == "Quantite"]) # 生成带缩放值的数据框 DF_scaled <- DF_agg %>% mutate( scaled_value = ifelse(Type == "Quantite", value * scale_factor, value) ) # 绘制双轴分组条形图 ggplot(DF_scaled, aes(x = Article, y = scaled_value, fill = Type)) + geom_bar(stat = "identity", position = "dodge", na.rm = TRUE) + # 右侧轴:将缩放值还原为原始数量 scale_y_continuous( name = "PrixTotalAvecRabais", sec.axis = sec_axis(~ . / scale_factor, name = "Quantite") ) + # 显示原始数值,对齐分组条形 geom_text( aes(label = round(value, 0)), position = position_dodge(width = 0.9), vjust = -0.5, size = 3 ) + labs(title = "商品数量与总销售额对比") + theme( legend.position = "bottom", axis.text.x = element_text(angle = 45, hjust = 1) )
关键修正说明
- 聚合步骤解决了重复标签和条形叠加的问题,确保每个分组仅对应一个条形
- 动态缩放因子让左右轴的数值范围匹配,避免固定比例导致的轴数值偏差
geom_text使用原始value作为标签,position_dodge保证标签与分组条形对齐,vjust调整位置至条形上方
内容的提问来源于stack exchange,提问作者Vincent ISOZ
相关产品推荐
相关产品推荐

