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

R中双独立Y轴条形图实现及PowerBI嵌入问题求助

解决ggplot2双Y轴条形图数值差距过大的问题

核心问题分析

你的代码里sec_axis(~./100000)只是对左侧Y轴刻度做了除法转换,但合同数量本身的数值远小于合同金额,导致对应条形高度几乎不可见。ggplot2的sec.axis并非真正的独立双Y轴,只是在同一轴上添加了另一组刻度,因此必须先对数值差距大的变量做缩放处理,让它的数值范围和另一变量匹配,再通过右侧轴还原真实值。

解决方案代码

假设你的原始数据宽表结构为:年月 | 合同金额 | 合同数量,按以下步骤修改代码:

library(ggplot2)
library(reshape2)

# 1. 将宽表转换为长格式
data_long <- melt(data, id.vars = "Group.1", variable.name = "Metric", value.name = "Value")

# 2. 计算缩放系数:用合同金额最大值除以合同数量最大值,让数量缩放后和金额量级匹配
amount_max <- max(subset(data_long, Metric == "合同金额")$Value)
count_max <- max(subset(data_long, Metric == "合同数量")$Value)
scale_factor <- amount_max / count_max

# 3. 对合同数量的数值进行缩放,保留原始分类标签
plot_data <- data_long
plot_data$Value[plot_data$Metric == "合同数量"] <- plot_data$Value[plot_data$Metric == "合同数量"] * scale_factor

# 4. 绘制双Y轴条形图
plot <- ggplot(plot_data, aes(x = Group.1, y = Value, fill = Metric)) +
  geom_col(position = "dodge", width = 0.7) +
  # 左侧Y轴显示合同金额,右侧Y轴通过反向缩放还原真实数量
  scale_y_continuous(
    name = "合同金额",
    sec.axis = sec_axis(~./scale_factor, name = "合同数量")
  ) +
  # 自定义填充色区分两类数据
  scale_fill_manual(values = c("合同金额" = "#1f77b4", "合同数量" = "#ff7f0e")) +
  # 旋转X轴年月标签,避免重叠
  theme(axis.text.x = element_text(angle = 45, hjust = 1))

关键说明

  • 缩放系数scale_factor的作用是把合同数量的数值放大到和合同金额相近的范围,确保条形高度正常显示;右侧轴通过~./scale_factor将缩放后的数值还原为真实的合同数量。
  • 如果你的变量名不是合同金额和合同数量,需要对应修改代码中的变量名称。
  • 可根据需求调整geom_col的width参数,优化条形的显示密度。

内容的提问来源于stack exchange,提问作者Nicholas Andrade

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 05:10:42