Quero agrupar a legenda em ggplot
várias partes. Vejamos o exemplo abaixo (retirado de https://stackoverflow.com/a/68608592/15910619 como resposta aceita de @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"))
No entanto, gostaria de alterar o estilo de posição de vários elementos da legenda, conforme demonstrado no instantâneo modificado abaixo
Existe alguma maneira de conseguir esse tipo de agrupamento na lenda ggplot
?
Muito obrigado pelo seu tempo e atenção.
Se você quiser uma linha para separar as duas legendas, você pode utilizar a
element_part_rect
função do pacote ggh4x .Resultados aproximados:
Edição 1:
Como você já sugeriu nos comentários, você pode alcançar o resultado desejado adicionando uma categoria falsa. No entanto, para obter a mesma largura para ambas as legendas, precisamos usar o mesmo rótulo para a categoria falsa e para a última categoria na segunda legenda do grupo, ou seja,
"Ideal"
para os dados de exemplo. Para evitar que o rótulo apareça na legenda, uso oggtext
pacote para tornar o rótulo transparente:Observação: a mesma abordagem deve, em princípio, funcionar para a abordagem de @Edward para obter uma linha de separação abrangendo a largura da caixa de legenda.