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

如何将ggplot2图例中的数字嵌入图例方块符号内

分组蜂群图图例符号嵌入数字的解决方案

这是关于分组蜂群图标签定位问题的跟进提问。

参考示例代码

library(ggplot2)

ggplot(mtcars, aes(x = factor(am), y = mpg, color = factor(am))) +
  geom_point(shape = 15, size = 6, alpha = 0.7,
             position = position_jitter(width = 0.25, height = 0, seed = 31)) +
  geom_text(aes(label = am), 
            position = position_jitter(width = 0.25, height = 0, seed = 31), 
            size = 3, color = "black") 

当前效果与需求

  • 当前可视化效果:分组散点图中,每个组的方块点旁标注对应数字,图例仅显示不同颜色的方块,数字在方块右侧。
  • 需求:将图例中的0和1直接嵌入到对应的方块符号内部,实现数字与方块融合的图例样式。

实现方案

通过自定义ggplot的图例符号,结合grid包创建带文本的图形对象,替换默认图例符号即可实现需求:

完整代码

library(ggplot2)
library(grid)

# 定义带文本的自定义图例符号生成函数
custom_legend_key <- function(data, params, size) {
  # 获取当前图例项的颜色和对应数字
  fill_color <- data$colour
  num_label <- as.character(data$am)
  
  # 创建方块图形
  square_grob <- rectGrob(
    gp = gpar(fill = fill_color, col = fill_color, alpha = 0.7),
    width = unit(12, "pt"), height = unit(12, "pt")
  )
  # 创建数字文本图形
  text_grob <- textGrob(
    num_label,
    gp = gpar(col = "black", fontsize = 10)
  )
  
  # 将文本叠加在方块中心
  grobTree(square_grob, text_grob)
}

# 绘制图形并应用自定义图例
ggplot(mtcars, aes(x = factor(am), y = mpg, color = factor(am))) +
  geom_point(shape = 15, size = 6, alpha = 0.7,
             position = position_jitter(width = 0.25, height = 0, seed = 31)) +
  geom_text(aes(label = am), 
            position = position_jitter(width = 0.25, height = 0, seed = 31), 
            size = 3, color = "black") +
  # 替换默认图例为自定义符号
  guides(
    color = guide_legend(
      override.aes = list(shape = NA),  # 取消默认形状
      key = custom_legend_key
    )
  ) +
  # 隐藏默认的图例旁文本,避免重复显示数字
  scale_color_discrete(labels = c("", ""))

代码说明

  1. custom_legend_key函数:使用rectGrob创建方块图形,textGrob创建数字文本,再通过grobTree将两者叠加,形成数字嵌入方块的复合图形。
  2. guides()配置:指定使用自定义的图例生成函数,并覆盖默认的形状参数,确保只显示我们创建的复合图形。
  3. scale_color_discrete():将图例的默认文本设为空,避免数字在方块旁重复显示。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 06:26:37