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

如何在ggplot中添加垂直对齐的文本框?

解决方案

要实现竖线旁添加固定像素距离、垂直居中的文本框,可以通过以下两种方式实现:

方法1:使用annotation_custom(基础R绘图对象)

这种方法直接利用ggplot的annotation_custom函数,结合unit单位精确控制位置,无需额外依赖包:

library(ggplot2)
set.seed(1)

# 绘制基础直方图
p <- ggplot(data.frame(x = rnorm(1000)), aes(x = x)) + 
  geom_histogram(breaks  = seq(-10, 10, 0.5),
                 mapping = aes(y = after_stat(density)),
                 colour  = "black",
                 alpha   = 0.3) +
  stat_function(fun = dnorm, args = list(mean = 0, sd = 1)) +
  geom_vline(xintercept = 2, linewidth = 0.70) +
  geom_vline(xintercept = -2, linewidth = 0.70)

# 添加x=2右侧的文本(无背景)
p <- p + annotation_custom(
  grob = textGrob("x=2", gp = gpar(col = "black")),
  xmin = unit(2, "native") + unit(10, "pt"),
  xmax = unit(2, "native") + unit(10, "pt"),
  ymin = unit(0.5, "npc"),
  ymax = unit(0.5, "npc")
)

# 添加x=-2左侧的文本(无背景)
p <- p + annotation_custom(
  grob = textGrob("x=-2", gp = gpar(col = "black")),
  xmin = unit(-2, "native") - unit(10, "pt"),
  xmax = unit(-2, "native") - unit(10, "pt"),
  ymin = unit(0.5, "npc"),
  ymax = unit(0.5, "npc")
)

print(p)

关键说明:

  • unit(2, "native")对应数据坐标中的x=2位置,加上unit(10, "pt")确保文本和竖线保持10像素距离;左侧文本则减去10像素。
  • unit(0.5, "npc")是归一化坐标(0=底部,1=顶部),直接将文本定位在y轴垂直中间位置。

方法2:使用ggtext::geom_richtext(带背景文本框)

如果需要带白色背景的文本框,推荐使用ggtext包的geom_richtext,样式更美观且易于调整:

library(ggplot2)
library(ggtext)
set.seed(1)

p <- ggplot(data.frame(x = rnorm(1000)), aes(x = x)) + 
  geom_histogram(breaks  = seq(-10, 10, 0.5),
                 mapping = aes(y = after_stat(density)),
                 colour  = "black",
                 alpha   = 0.3) +
  stat_function(fun = dnorm, args = list(mean = 0, sd = 1)) +
  geom_vline(xintercept = 2, linewidth = 0.70) +
  geom_vline(xintercept = -2, linewidth = 0.70)

# 获取y轴范围的中间值
y_mid <- mean(layer_scales(p)$y$range$range)

# 添加右侧带背景的文本框
p <- p + geom_richtext(
  aes(x = 2, y = y_mid),
  label = "x=2",
  hjust = 0,  # 文本左对齐,对应向右偏移
  nudge_x = unit(10, "pt"),  # 向右偏移10像素
  fill = "white",
  label.size = 0.3,  # 文本框边框粗细
  color = "black"
)

# 添加左侧带背景的文本框
p <- p + geom_richtext(
  aes(x = -2, y = y_mid),
  label = "x=-2",
  hjust = 1,  # 文本右对齐,对应向左偏移
  nudge_x = -unit(10, "pt"),  # 向左偏移10像素
  fill = "white",
  label.size = 0.3,
  color = "black"
)

print(p)

关键说明:

  • nudge_x = unit(10, "pt")直接控制文本相对于竖线的像素偏移量,确保固定距离。
  • hjust参数设置文本对齐方式,避免偏移后文本和竖线重叠。
  • y_mid通过获取y轴范围的平均值计算中间位置,贴合实际数据范围的垂直中点。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 04:13:09