在 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 创建
我想知道是否可以为 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 创建