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

如何修复柱状图与折线图组合图中的次Y轴问题

解决ggplot2组合图折线位置偏低与次Y轴刻度缺失问题

问题原因

  1. 折线位置过低:原代码中adjust = 2000的缩放比例过大,jordan数值(137.7-255)除以2000后仅为0.068-0.127,远小于主Y轴的范围(0-6),导致折线紧贴图表底部。
  2. 次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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 17:32:06