ggplot2组合柱状图与折线图:次坐标轴(sec.axis)配置问题求助
解决ggplot2合并柱状图与折线图的双轴显示问题
问题说明
单独绘制展示Delivery.Count的柱状图、展示Cumulative.Percent的折线图均正常,但合并后折线始终沿底部显示;添加scale_y_continuous时出现cannot give a NULL trans错误,需要实现类似PowerBI中「折线+堆叠柱状图」的效果,让次坐标轴匹配柱状图的最大值范围。
数据准备
Delivery.Count <- c(382,12331,438,27375,6180,5329,3666,11324,9602,212,6851,10874,590,1527) Cumulative.Percent <- c(0.38,12.78,13.22,40.73,46.94,52.29,55.98,67.36,77.01,77.22,84.11,95.04,95.63,97.16) Delivery.Date <- c("Friday, September 9, 2022","Saturday, September 10, 2022","Sunday, September 11, 2022","Monday, September 12, 2022","Tuesday, September 13, 2022","Wednesday, September 14, 2022","Thursday, September 15, 2022","Friday, September 16, 2022","Saturday, September 17, 2022","Sunday, September 18, 2022","Monday, September 19, 2022","Tuesday, September 20, 2022","Wednesday, September 21, 2022","Thursday, September 22, 2022") Cumulative.Total <- c(382,12713,13151,40526,46706,52035,55701,67025,76627,76839,83690,94564,95154,96681) dataset <- data.frame(Delivery.Count,Cumulative.Percent,Delivery.Date,Cumulative.Total) dataset$Delivery.Date <- as.Date(dataset$Delivery.Date,format="%A, %B %d, %Y")
问题根源
两个指标量级差距极大:Delivery.Count最大值超过27000,而Cumulative.Percent最大值仅97,直接合并时折线会被压缩到坐标轴底部;添加次轴时出错是因为未正确设置数值转换函数。
解决方案
通过数值缩放将折线图的百分比值映射到柱状图的数值范围,再通过次轴反转转换显示原始百分比刻度:
完整代码
library(ggplot2) # 计算缩放系数:用柱状图最大值除以折线图最大值,让百分比最大值匹配柱状图最大值 scale_factor <- max(dataset$Delivery.Count) / max(dataset$Cumulative.Percent) ggplot(dataset) + # 绘制柱状图(对应主坐标轴) geom_bar(aes(x = Delivery.Date, y = Delivery.Count), fill = "#00FFFF", stat = "identity") + # 绘制折线图:将百分比值缩放至柱状图的数值范围 geom_line(aes(x = Delivery.Date, y = Cumulative.Percent * scale_factor), color = "red", linewidth = 1) + # 添加折线数据点,增强可读性 geom_point(aes(x = Delivery.Date, y = Cumulative.Percent * scale_factor), color = "red", size = 2) + # 设置双坐标轴:主轴显示配送数量,次轴反转缩放显示原始百分比 scale_y_continuous( name = "配送数量", sec.axis = sec_axis( trans = ~ . / scale_factor, # 反转缩放逻辑,还原百分比数值 name = "累计占比(%)" ) ) + # 优化日期轴显示,避免标签重叠 scale_x_date(date_labels = "%m-%d", date_breaks = "1 day") + theme(axis.text.x = element_text(angle = 45, hjust = 1))
代码关键说明
- 缩放系数:保证折线图的最大值与柱状图最大值对齐,避免折线被压缩到底部。
- 次轴转换函数:
~ . / scale_factor是明确的数值转换逻辑,解决cannot give a NULL trans错误。 - 日期轴优化:旋转标签并设置日间隔,提升图表可读性。
内容的提问来源于stack exchange,提问作者OldManSeph
相关产品推荐
相关产品推荐

