如何调整ggplot2中SST的次级Y轴起始值至20?
解决ggplot2次级Y轴起始值调整问题
你之前只修改次级轴的breaks没用,因为SST数据点的位置是由av_SST /10这个映射关系决定的——单纯改轴刻度只是隐藏了0-20区间,数据点的实际位置根本没变化。要让SST数据点靠近RI数据,得重新定义SST到主Y轴的映射规则,同时对应调整次级轴的转换逻辑:
修改思路
- 把SST的起始值20映射到主Y轴的合理位置(比如主轴的0点),通过线性转换压缩SST数据的取值范围,让它和RI数据的范围重叠
- 同步调整次级轴的转换公式,确保刻度对应正确的SST数值
- 给次级轴设置从20开始的刻度
修改后的完整代码
# 先锁定SST的起始值,计算最大值方便后续设置刻度 min_sst <- 20 max_sst <- max(average_RI_per_month_species$av_SST) # 转换系数:数值越小,SST数据点在主轴上的位置越高,可根据RI的实际范围调整 scale_factor <- 5 ggplot(average_RI_per_month_species, aes(x = factor(month))) + geom_point(aes(y = avg_RI, color = species, shape = "RI"), size = 3) + geom_line(aes(y = avg_RI, color = species, linetype = species), size = 1) + # 调整SST映射逻辑:将SST从[20, max_sst]压缩到主轴的[0, (max_sst-20)/scale_factor]区间 geom_point(aes(y = (av_SST - min_sst)/scale_factor, shape = "SST"), color = "black", size = 3, alpha = 0.7) + geom_line(aes(y = (av_SST - min_sst)/scale_factor), color = "black", size = 1, alpha = 0.7) + scale_y_continuous( name = "Average RI", # 次级轴还原SST真实数值 sec.axis = sec_axis(~ .*scale_factor + min_sst, name = "Average SST (°C)", # 设置次级轴从20开始的刻度 breaks = seq(min_sst, max_sst, by = 5)) ) + labs( title = "Monthly Average RI and SST", x = "Month", color = "Species", shape = "Metric", linetype = "Species" ) + scale_x_discrete(labels = month.abb) + scale_color_manual(values = c("Galapagos" = "blue", "Silky" = "red")) + scale_shape_manual(values = c("RI" = 16, "SST" = 17)) + # 16=实心圆,17=实心三角 theme_minimal()
关键调整点
- 把
av_SST /10替换成(av_SST - 20)/scale_factor:让SST的最小值20对应主轴的0,后续数值按比例压缩 - 次级轴的转换函数从
~ .*10改成~ .*scale_factor +20:把主轴的映射值还原回真实的SST温度 - 给次级轴明确设置
breaks = seq(20, max_sst, by=5):确保刻度从20开始,按5的间隔递增
你可以根据RI数据的实际范围调整scale_factor:如果RI数据在0-5,把scale_factor设为2的话,SST(20-30)会转换为0-5,和RI完全重叠;设为5的话转换为0-2,会在RI数据的下方区域,按需调整即可。
内容的提问来源于stack exchange,提问作者Charlie Riddick
相关产品推荐
相关产品推荐

