修改垂直图例中关键字形之间的间距,同时保持关键字形边框
Modify spacing between key glyphs in vertical legend whilst keeping key glyph border
作为 this famous thread. I decided to ask a new question because this is more specifically for vertical legends, and the given answers still don't provide a fully satisfactory solution. For polygon key glyphs, there was a suggestion to increase the size of the margin between the actual polygon glyph and the key border, with a modification of the underlying draw_key function 的跟进。但是,如果我想保留边框(例如黑色边框),这实际上不起作用。
并且在使用其他 geom 时(例如,geom_line),我什至没有看到如何增加字形和边框之间的边距 - 简要浏览一下中使用的 draw_key 函数ggplot2:::GeomLine
(它不使用导出的 draw_key 函数),我不清楚在哪里修改它。
所以,我的问题是,是否有一种方法可以更改关键字形之间的实际 space,从而允许保留边框(例如,color = "black"),而不增加字形尺寸。
library(ggplot2)
p <- ggplot(dplyr::filter(msleep, grepl("^C", order)),
aes(sleep_total, sleep_rem, color = order)) +
geom_line(na.rm = TRUE) +
theme(legend.key = element_rect(color = "black"))
p
示例图:键字形接触。
p + theme(legend.key.height = unit(.5, "in"))
示例如果我删除颜色,字形看起来会更 spaced,但我希望关键字形与上面的大小相同,只是它们之间 space .
GeomLine
中的底层draw_key
# ggplot2:::GeomLine$draw_key
#> ...
#> segmentsGrob(0.1, 0.5, 0.9, 0.5, gp = gpar(col = alpha(data$colour %||%
#> data$fill %||% "black", data$alpha), fill = alpha(params$arrow.fill %||%
#> data$colour %||% data$fill %||% "black", data$alpha),
#> lwd = (data$size %||% 0.5) * .pt, lty = data$linetype %||%
#> 1, lineend = "butt"), arrow = params$arrow)
#> ...
由 reprex package (v2.0.1)
于 2021-12-29 创建
P.S。这个问题是在回答
时出现的
有一种方法可以做到这一点,但不是很直观。这取决于图例指南中的 byrow
设置,是否遵守图例间距(不要问我为什么!)。
library(ggplot2)
ggplot(dplyr::filter(msleep, grepl("^C", order)),
aes(sleep_total, sleep_rem, color = order)) +
geom_line(na.rm = TRUE) +
guides(
color = guide_legend(byrow = TRUE)
) +
theme(legend.key = element_rect(color = "black"),
legend.spacing.y = unit(1, "cm"))
由 reprex package (v2.0.0)
于 2021-12-30 创建
我抱怨 raised the suggestion这在其他地方不直观。
如果希望标题在比较正常的位置,可以对主题功能使用如下咒语,其中11pt为默认图例间距:
legend.title = element_text(
margin = margin(
b = -1 + grid::convertUnit(unit(11, "pt"), "cm", valueOnly = TRUE),
unit = "cm")
)
作为 this famous thread. I decided to ask a new question because this is more specifically for vertical legends, and the given answers still don't provide a fully satisfactory solution. For polygon key glyphs, there was a suggestion to increase the size of the margin between the actual polygon glyph and the key border, with a modification of the underlying draw_key function 的跟进。但是,如果我想保留边框(例如黑色边框),这实际上不起作用。
并且在使用其他 geom 时(例如,geom_line),我什至没有看到如何增加字形和边框之间的边距 - 简要浏览一下中使用的 draw_key 函数ggplot2:::GeomLine
(它不使用导出的 draw_key 函数),我不清楚在哪里修改它。
所以,我的问题是,是否有一种方法可以更改关键字形之间的实际 space,从而允许保留边框(例如,color = "black"),而不增加字形尺寸。
library(ggplot2)
p <- ggplot(dplyr::filter(msleep, grepl("^C", order)),
aes(sleep_total, sleep_rem, color = order)) +
geom_line(na.rm = TRUE) +
theme(legend.key = element_rect(color = "black"))
p
示例图:键字形接触。
p + theme(legend.key.height = unit(.5, "in"))
示例如果我删除颜色,字形看起来会更 spaced,但我希望关键字形与上面的大小相同,只是它们之间 space .
GeomLine
中的底层draw_key# ggplot2:::GeomLine$draw_key
#> ...
#> segmentsGrob(0.1, 0.5, 0.9, 0.5, gp = gpar(col = alpha(data$colour %||%
#> data$fill %||% "black", data$alpha), fill = alpha(params$arrow.fill %||%
#> data$colour %||% data$fill %||% "black", data$alpha),
#> lwd = (data$size %||% 0.5) * .pt, lty = data$linetype %||%
#> 1, lineend = "butt"), arrow = params$arrow)
#> ...
由 reprex package (v2.0.1)
于 2021-12-29 创建P.S。这个问题是在回答
有一种方法可以做到这一点,但不是很直观。这取决于图例指南中的 byrow
设置,是否遵守图例间距(不要问我为什么!)。
library(ggplot2)
ggplot(dplyr::filter(msleep, grepl("^C", order)),
aes(sleep_total, sleep_rem, color = order)) +
geom_line(na.rm = TRUE) +
guides(
color = guide_legend(byrow = TRUE)
) +
theme(legend.key = element_rect(color = "black"),
legend.spacing.y = unit(1, "cm"))
由 reprex package (v2.0.0)
于 2021-12-30 创建我抱怨 raised the suggestion这在其他地方不直观。
如果希望标题在比较正常的位置,可以对主题功能使用如下咒语,其中11pt为默认图例间距:
legend.title = element_text(
margin = margin(
b = -1 + grid::convertUnit(unit(11, "pt"), "cm", valueOnly = TRUE),
unit = "cm")
)