我想将图例分成ggplot
多个部分。请考虑以下示例(摘自https://stackoverflow.com/a/68608592/15910619,已接受 @stefan 的答案)
library(ggplot2)
library(ggnewscale)
diamonds$cut = factor(diamonds$cut, levels=c("Fair","Good", "Very Good",
"Premium","Ideal"))
labels <- levels(diamonds$cut)
labels <- setNames(labels, labels)
labels["Fair"] <- "Very Good"
labels["Good"] <- "Premium"
colors <- hcl(seq(15, 325, length.out = 5), 100, 65)
colors <- setNames(colors, levels(diamonds$cut))
ggplot() +
geom_bar(data = diamonds, aes(color, fill = cut)) +
scale_fill_manual(aesthetics = "fill", values = colors, labels = labels[1:2],
breaks = names(colors)[1:2], name = "First Group:",
guide = guide_legend(title.position = "left", order = 1)) +
new_scale_fill() +
geom_bar(data = diamonds, aes(color, fill = cut)) +
scale_fill_manual(aesthetics = "fill", values = colors, labels = labels[3:5],
breaks = names(colors)[3:5], name = "Second Group:",
guide = guide_legend(title.position = "left", order = 0)) +
theme(legend.position = "bottom",
legend.direction = "horizontal",
legend.key = element_rect(fill = "white"))
但是我想改变图例中各个元素的位置样式,如下面的修改后的快照所示
有没有什么方法可以实现图例中的这种分组ggplot
?
非常感谢您的时间和关注。
如果您想要一条线来分隔两个图例,您可以利用ggh4x
element_part_rect
包中的函数。近似结果:
编辑1:
正如您在评论中提到的,您可以通过添加一个虚假类别来实现所需的结果。但是,为了使两个图例的宽度相同,我们必须为虚假类别使用与第二组图例中最后一个类别(即
"Ideal"
示例数据)相同的标签。为了避免标签显示在图例中,我使用以下ggtext
包使标签透明:注意:原则上,同样的方法也适用于@Edward 的方法,以获得跨越图例框宽度的分隔线。