You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

双轴分组条形图绘制异常求助:轴值错误与重复标签

双轴分组条形图修正方案

原问题核心问题

当前代码存在三个关键错误:

  • 未对原始数据按商品和指标聚合,导致同一商品的同一指标存在多条记录,条形图实际叠加显示,标签重复出现
  • 缩放比例不匹配: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 18:51:20