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

ggplot2技术需求:调整Y轴刻度样式及添加stat_summary点图例

解决ggplot2的两个需求:Y轴标签居中显示 + stat_summary点添加图例

问题1:Y轴标签位于两个刻度之间

离散型Y轴默认不生成次要刻度,因此axis.minor.ticks.length.y参数不会生效。我们可以将Y轴转换为连续型,手动控制刻度和标签位置:

  • 将分类变量ca转换为连续数值,作为Y轴的映射值
  • 通过scale_y_continuous设置标签在每个分类的中心位置,次要刻度放在分类的上下边界
  • 隐藏主刻度,只显示次要刻度并调整长度

问题2:为stat_summary的点添加图例

stat_summary的点默认没有图例,因为未将颜色/填充属性映射到变量。只需给点添加自定义映射项,再统一设置颜色即可:

  • 在stat_summary的aes中加入fill = "Total",定义图例中的项名称
  • 通过scale_fill_manual同时设置条形(A/B/C)和汇总点(Total)的颜色,生成完整图例

完整代码:

library("ggplot2")
dt <- data.frame(
  ca = rep(c("Oesophageal cancer", "Gastric cancer", "Colorectal cancer"), 3),
  var1 = c(1:3, -4:-6, 7:9),
  var2 = rep(LETTERS[1:3], 3)
)

# 把分类变量转换为连续数值,用于Y轴映射
dt$ca_num <- as.numeric(factor(dt$ca))
ca_labels <- unique(dt$ca)
ca_values <- unique(dt$ca_num)

dt %>% 
  ggplot(aes(var1, ca_num, fill = var2)) +
  geom_bar(stat = "identity", width = 0.8) +
  # 为汇总点添加图例映射
  stat_summary(aes(fill = "Total"), fun = sum, geom = "point", colour = "grey40", shape = 20, size = 2) +
  geom_vline(xintercept = 0, colour = "grey30", linetype = "dotted") +
  # 设置Y轴:标签居中,次要刻度在分类上下
  scale_y_continuous(
    breaks = ca_values,
    labels = ca_labels,
    minor_breaks = unlist(lapply(ca_values, function(x) c(x - 0.5, x + 0.5))),
    expand = c(0.1, 0)
  ) +
  # 统一设置填充颜色,包含条形和汇总点
  scale_fill_manual(
    name = "",
    values = c(
      "A" = "#F8766D", 
      "B" = "#00BA38", 
      "C" = "#619CFF", 
      "Total" = "grey40"
    )
  ) +
  theme(
    # 隐藏主Y轴刻度,显示次要刻度
    axis.ticks.y = element_blank(),
    axis.minor.ticks.y = element_line(color = "black"),
    axis.minor.ticks.length.y = unit(5, "pt"),
    # 调整Y轴标签的左右边距,让位置更居中
    axis.text.y = element_text(margin = margin(r = 10))
  )

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 19:34:52