R语言ggplot如何实现单图双X轴(底部depth、顶部min)绘制
ggplot 双X轴(底部depth/顶部min)实现方案
ggplot2 支持配置次坐标轴,次轴要求与主轴存在固定的一一映射关系,你当前数据里depth和min是逐行位置对应的关系,直接通过sec_axis()配置即可实现需求,不需要额外做数据转换。
完整实现代码
先确认数据框LHB结构和给出的示例一致,在原有代码基础上添加X轴刻度配置即可:
library(ggplot2) # 示例数据赋值(如果已读入LHB可跳过这段) LHB <- read.table(text = " depth s.den c.den bd car X min 1 1 0.3023393 2.859395 0.05735 35.74244 0 2017 2 2 0.3055764 3.373670 0.07015 42.17087 1 1987 3 3 0.3367664 4.629492 0.09165 42.08629 2 1954 4 4 0.3318848 3.789447 0.07765 37.89447 3 1941 5 5 0.3178764 3.432860 0.07075 31.20782 4 1920 6 6 0.2401508 2.808528 0.06045 28.08528 5 1909 7 7 0.3044616 2.480078 0.05715 22.54617 6 1889 8 8 0.4002132 3.250899 0.06770 32.50899 7 1878 9 9 0.4551193 2.901270 0.05735 29.01270 8 1860 ", header = TRUE) # 修正后的绘图代码 CAR <- ggplot()+ geom_line(data = LHB, mapping = aes(x = depth, y = car), col = 'black') + ggtitle("CARLHB") + # 配置底部主X轴+顶部次X轴 scale_x_continuous( name = "Depth (cm)", breaks = LHB$depth, sec.axis = sec_axis( trans = ~., # 次轴与主轴位置1:1映射,无需数值变换 breaks = LHB$depth, # 次轴刻度位置与主轴完全对齐 labels = LHB$min, # 对应位置替换为min列的年份标签 name = "Year" ) ) + ylab(bquote(Carbon~Accumulation~(g~C/m^2/yr^-1))) CAR
参数说明
trans = ~.表示次轴和主轴的坐标位置完全对应,因为两个X轴的刻度点位置重合,仅显示标签不同,不需要做缩放、偏移类的数值转换- 如果后续数据量更新,只需要保证
breaks传入所有depth值、labels传入对应位置的min值即可,不需要改动其他逻辑 - 如果需要调整顶部轴的文字、刻度线样式,可以在
theme()中通过axis.text.x.top、axis.title.x.top参数单独配置样式
内容的提问来源于stack exchange,提问作者Ian
相关产品推荐
相关产品推荐

