在 ggplot2 中创建完全自定义的图例

Creating completely customized legends in ggplot2

我想知道是否可以为 ggplot 图创建一个完全自定义的图例,它不考虑给定图中使用的任何形状、大小、列名等。考虑到复杂的数据集可能难以重命名,并且向 ggplot 图轴、注释和标签添加文本非常简单,情况可能并非如此,这似乎很奇怪。是否可以像添加主题一样将其添加到 ggplot object?假设我想要一个标题为“不同水果”的图例,三个变量是“苹果”、“香蕉”和“芒果”,与它们相关的三个符号是一个实心的黑色圆圈、一个空心圆圈和空心三角形。

这是我正在研究的一些数据:


library(ggplot2)
library(dplyr)

data_dna <- DNase

plot_dna <- ggplot(data_dna, aes(x = conc, y = density)) + geom_point()

plot_dna + theme(legend.position = c(2, 2), legend.text = element_text(size = 15))


这根本就没有成功生成图例。如果您对此有任何线索,请告诉我。

这是我想出的一个 hacky 解决方案。它绘制了一个不可见的 geom 层,初始化了一个虚拟的美学和相关的比例。不太灵活,但应该可以解决问题。

library(ggplot2)
library(rlang)
#> Warning: package 'rlang' was built under R version 4.1.1

data_dna <- DNase

plot_dna <- ggplot(data_dna, aes(x = conc, y = density)) + geom_point()

dummy_guide <- function(
    labels = NULL,  
    ..., 
    title = NULL, 
    key   = draw_key_point,
    guide_args = list()
) {
  # Capture arguments
  aesthetics <- list(...)
  n <- max(lengths(aesthetics), 0)
  labels <- labels %||%  seq_len(n)
  
  # Overrule the alpha = 0 that we use to hide the points
  aesthetics$alpha <- aesthetics$alpha %||% rep(1, n)
  
  # Construct guide
  guide_args$override.aes <- guide_args$override.aes %||% aesthetics
  guide <- do.call(guide_legend, guide_args)
  
  # Allow dummy aesthetic
  update_geom_defaults("point", list(dummy = "x"))
  
  dummy_geom <- geom_point(
    data = data.frame(x = rep(Inf, n), y = rep(Inf, n), 
                      dummy = factor(labels)),
    aes(x, y, dummy = dummy), alpha = 0, key_glyph = key
  )
  dummy_scale <- discrete_scale(
    "dummy", "dummy_scale", palette = scales::identity_pal(), name = title,
    guide = guide
  )
  list(dummy_geom, dummy_scale)
}

在没有任何参数的情况下添加它不会产生任何结果。

plot_dna + dummy_guide()

默认情况下,它将键创建为点。

plot_dna + dummy_guide(
  labels = c("Apple", "Banana", "Mango"), 
  shape  = c(16, 21, 24),
  title  = "Different Fruit"
)

您可以更改为其他键。

plot_dna + dummy_guide(
  labels = c("Foo", "Bar", "Baz"), 
  fill   = c("blue", "green", "red"),
  colour = NA,
  title  = "Metasyntactic variables",
  key = draw_key_polygon
)

reprex package (v2.0.1)

于 2022-02-03 创建