如何判断双轴柱状图左右Y轴并调整ggplot双轴位置?
双Y轴柱状图调整及轴判断方法
一、调整轴位置:将Accumulated RFU轴置于上方
你使用了coord_flip(),ggplot会交换X/Y轴的显示位置——原主Y轴会变成下方的水平轴,次Y轴会变成上方的水平轴。要实现RFU轴在上、OD600轴在下的效果,需要交换主/次轴的定义,同时调整Y值的映射逻辑,确保柱状图高度匹配对应轴的刻度:
修改后的代码如下(coeff仍为5000):
coeff <- 5000 ggplot(mean_sum_long, aes(x = Nitrogen_Source, y = ifelse(name == "gfp_mean", value/coeff, value), fill = name)) + geom_col(position = "dodge", alpha = 0.8) + scale_y_continuous( name = "Accumulated OD600", # 主轴(翻转后显示在下方) sec.axis = sec_axis(~ . * coeff, name = "Accumulated RFU") # 次轴(翻转后显示在上方) ) + scale_fill_manual(values = c("green", "tomato")) + theme(axis.text.y = element_text(angle = 30, vjust = 0.5)) + # 翻转后原X轴变为Y轴,调整文本角度 coord_flip()
逻辑说明:
- 先把RFU数值(
gfp_mean)按比例缩小到OD600的刻度范围(value/coeff),确保两类柱子的高度在同一坐标系下合理显示 - 将OD600设为主轴(对应下方水平轴),RFU设为次轴(通过
~.*coeff把主轴刻度还原为RFU的实际数值,对应上方水平轴)
二、双Y轴的左右/上下判断方法
未使用coord_flip()时:
scale_y_continuous()定义的是左侧主Y轴,对应你原始数据中直接映射到y=value的数值sec_axis()定义的是右侧次Y轴,基于主轴线性转换得到
使用coord_flip()后:
- 原左侧主Y轴 → 变为下方的水平轴
- 原右侧次Y轴 → 变为上方的水平轴
- 快速验证:临时注释掉
coord_flip(),观察原始的左右轴对应关系,就能对应到翻转后的上下轴位置
内容的提问来源于stack exchange,提问作者Salt_Industry
相关产品推荐
相关产品推荐

