如何创建双X轴(mm/%刻度,对应同一Y轴数据)的图表?已试sec.axis未果
实现双X轴(毫米+百分比)的ggplot图表
要实现这种双X轴刻度的图表,核心是利用ggplot2的sec.axis参数,结合毫米与百分比之间的线性转换关系来配置副轴。以下是具体步骤和代码示例:
核心逻辑
两个X轴必须是线性关联的:假设总长度为L毫米,那么任意毫米值x对应的百分比为(x/L)*100;反过来,百分比p对应的毫米值为(p/100)*L。你需要先确定这个总长度L(即100%对应的毫米数)。
完整代码示例
# 加载所需包 library(ggplot2) library(scales) # 定义总长度(替换为你实际场景中100%对应的毫米数) total_length <- 200 # 准备数据:X为毫米刻度,Y值固定 df <- data.frame( mm = c(0, 40, 80, 120, 160, 200), y = rep(5, 6) # 所有数据的Y值相同 ) # 绘制图表 ggplot(df, aes(x = mm, y = y)) + geom_point(size = 3, color = "#2c3e50") + # 绘制数据点 scale_x_continuous( name = "长度 (mm)", # 主X轴(毫米)标题 breaks = df$mm, # 自定义主刻度位置 sec.axis = sec_axis( trans = ~ (. / total_length) * 100, # 毫米转百分比的转换公式 name = "占比 (%)", # 副X轴(百分比)标题 breaks = seq(0, 100, 20), # 自定义副刻度位置 labels = percent_format(accuracy = 1) # 刻度显示为百分比格式 ) ) + scale_y_continuous(limits = c(0, 10)) + # 调整Y轴范围适配数据 theme_minimal() + theme( axis.title.x.top = element_text(margin = margin(b = 10)), # 副轴标题与刻度的间距 axis.text.x = element_text(size = 10) )
关键注意事项
- 必须明确总长度
L:这是两个刻度转换的核心依据,如果没有这个值,无法建立线性关联。 - 转换函数不要写反:如果主轴是百分比、副轴是毫米,转换函数改为
~ (. / 100) * total_length即可。 - 自定义刻度:通过
breaks参数可以指定主副轴的刻度位置,让图表更贴合你的需求。
内容的提问来源于stack exchange,提问作者user21264596
相关产品推荐
相关产品推荐

