如何在ggplot2中为第三轴添加自定义标签(忽略Inf值)
问题:ggplot2中添加自定义顶部X轴标签
现有数据框dd:
dd=structure(list(req = c(0, 6.24296787098387e-05, 0.000124859357419677, 0.000187289036129516, 0.000249718714839355, 0.000312148393549194 ), st = c(4.20392459337459, 3.101869731322, 3.05827365904846, 2.55875394873998, 1.61722938145694, 0.969328686413803), tt = c(1.66320917439717, 1.46619835076717, 1.47423709334019, 1.39210979230404, 1.24099973128753, 1.15120693233888), nn = c(2.09771326762665, 1.74025312387583, 1.74965887129391, 1.64515722021115, 1.38734468460281, 1.30261082263608 )), row.names = c(NA, 6L), class = "data.frame")
已用以下代码绘制基础折线图:
ggplot(data = dd, aes(x=req)) + geom_line(aes(y=st), size = .8) fs <- pretty(dd[["req"]]) pers <- round(1 / fs, 2)
在基础绘图中可通过axis(3, at = req, labels = pers)实现将pers(忽略Inf值)作为顶部轴标签,请问如何在ggplot2中实现该需求?
解决方案
在ggplot2中,可通过scale_x_continuous()的sec.axis参数实现顶部自定义轴,步骤如下:
- 过滤无效标签:先剔除
pers中的Inf值,同时保留对应的主刻度位置:
# 筛选非Inf的标签及对应位置 valid_idx <- !is.infinite(pers) fs_valid <- fs[valid_idx] pers_valid <- pers[valid_idx]
- 绘制带顶部轴的折线图:利用
sec_axis()创建顶部轴,指定刻度位置和自定义标签:
ggplot(data = dd, aes(x = req)) + geom_line(aes(y = st), size = .8) + scale_x_continuous( # 主X轴刻度使用过滤后的有效位置 breaks = fs_valid, # 顶部次要轴设置 sec.axis = sec_axis( trans = ~., # 保持与主轴刻度位置完全对应 breaks = fs_valid, labels = pers_valid, name = "自定义顶部轴" # 可替换为实际轴标题 ) )
- 额外说明:
sec_axis()的trans参数定义次要轴与主轴的转换逻辑,这里因为标签是基于主轴刻度的倒数计算,直接用~.保持位置匹配即可。- 若需调整顶部轴的样式,可通过
theme()中的axis.text.top、axis.title.top等参数修改字体、颜色、位置。
内容的提问来源于stack exchange,提问作者bic ton
相关产品推荐
相关产品推荐

