如何修复柱状图与折线图组合图中的次Y轴问题
解决ggplot2组合图折线位置偏低与次Y轴刻度缺失问题
问题原因
- 折线位置过低:原代码中
adjust = 2000的缩放比例过大,jordan数值(137.7-255)除以2000后仅为0.068-0.127,远小于主Y轴的范围(0-6),导致折线紧贴图表底部。 - 次Y轴刻度缺失:主Y轴限制为0-6,对应次Y轴的范围是0×2000=0到6×2000=12000,而设置的次Y轴刻度(0-300)仅占这个范围的极小部分,被压缩到图表底部无法显示。
修改后的代码
# 输入数据 year <- c("2016", "2017", "2018", "2019", "2020", "2021", "2022") nike <- c(2.8, 3.1, 2.9, 3.1, 3.6, 4.7, 5.1) jordan <- c(137.7, 154.9, 142.8, 156.9, 180.5, 235.6, 255.0) data <- data.frame(year = year, nike = nike, jordan = jordan) # 调整缩放比例:让jordan缩放后与nike的数值范围匹配 adjust <- max(jordan) / max(nike) # 计算得约50,也可手动设为50 # 绘制图表并添加次Y轴 library(ggplot2) colors <- c("Jordan Brand Revenue (in $B)" = "black", "Michael Jordan Earnings (in $M)" = "red3") ggplot(data, aes(x=year))+ geom_col(aes(y = nike, color="Jordan Brand Revenue (in $B)"), lwd = 1 , fill = "black") + geom_line(aes(y = jordan/adjust, color="Michael Jordan Earnings (in $M)"), lwd = 1.5, group = 1)+ scale_y_continuous( name = "Jordan Brand Revenue (in $B)", breaks = seq(0,6,1), limits = c(0,6), sec.axis = sec_axis(~.*adjust, name = "Michael Jordan Earnings (in $M)", labels = scales::dollar, breaks= seq(0,300,50)) ) + theme_classic() + scale_color_manual(values=colors)+ theme(axis.title.x=element_blank(), panel.grid.major.y = element_line(), legend.title = element_blank(), legend.position = "top")
关键修改点
- 调整缩放比例:将
adjust改为max(jordan)/max(nike),确保jordan/adjust的数值范围(约2.7-5)与nike的范围(2.8-5.1)基本一致,折线会显示在图表的正常高度区间。 - 匹配次Y轴范围:缩放比例调整后,主Y轴0-6对应次Y轴0-300(6×50),刚好覆盖
jordan的最大值255,次Y轴的刻度(0、50、100...300)会正常显示在右侧。 - 统一图例标签:原代码中
geom_col的color标签和colors向量的名称不一致,修改后保持一致,确保图例正确显示。
内容的提问来源于stack exchange,提问作者Data and AI Nerd
相关产品推荐
相关产品推荐

