You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何创建双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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 17:39:24