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
相关产品推荐
相关产品推荐

