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

如何用ggplot2为分面直方图添加x>300的红色次级Y轴

实现分面次级Y轴并高亮指定区间柱形

当然可以实现这个需求!不过得先提一句:ggplot官方其实不太推荐使用次级Y轴(因为很容易误导读者对数据的理解),但如果是特定场景下的可视化需求,咱们可以这么来做:

步骤说明与代码实现

首先咱们先准备好数据,然后拆分数据并配置双Y轴和颜色:

library(ggplot2)

set.seed(123)
df <- data.frame(x = sample(1:500, 800, replace = TRUE), id = rep(1:5, each = 160))

# 绘制带次级Y轴的分面直方图
ggplot() +
  # 绘制x≤300的柱形,用默认灰色
  geom_histogram(
    data = subset(df, x <= 300), 
    aes(x = x), 
    fill = "gray", color = "black", 
    bins = 15  # 可以根据需求调整分箱数
  ) +
  # 绘制x>300的柱形,设置为红色
  geom_histogram(
    data = subset(df, x > 300), 
    aes(x = x), 
    fill = "red", color = "black", 
    bins = 5  # 右侧区间范围小,减少分箱数更清晰
  ) +
  # 按id分面
  facet_wrap(~id) +
  # 配置双Y轴:主Y轴对应灰色柱形,次级Y轴对应红色柱形
  scale_y_continuous(
    name = "计数 (x ≤ 300)",
    sec.axis = sec_axis(
      ~.,  # 因为都是计数,用恒等转换即可
      name = "计数 (x > 300)",
      # 把次级Y轴的元素都设为红色
      axis.line = element_line(color = "red"),
      axis.text = element_text(color = "red"),
      axis.title = element_text(color = "red")
    )
  ) +
  labs(x = "X 值") +
  theme_bw()  # 用简洁的主题让可视化更清晰

关键细节解释

  • 我们把原始数据拆分成了x≤300和x>300两个子集,分别绘制直方图,这样能精准控制不同区间的柱形颜色。
  • 次级Y轴使用sec_axis()实现,这里因为两个区间的计数范围一致,所以转换函数用~.(恒等转换)就行。
  • 通过axis.line、axis.text、axis.title参数把次级Y轴的所有元素都设置为红色,和红色柱形形成对应。

内容的提问来源于stack exchange,提问作者89_Simple

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 03:48:19