Como posso ajustar a altura da barra de cores da legenda para corresponder à altura dos meus gráficos ao usar facet_wrap()
? Esta pergunta SO relacionada oferece uma boa solução para um único gráfico, mas quando vários gráficos estão presentes, a barra de cores se estende até a metade do título de quebra de faceta e do texto do eixo. Gostaria que a barra de cores se estendesse apenas da base do título de quebra de faceta até o topo do texto do eixo.
Fazendo o gráfico base
(observe a pequena altura da barra de cores)
library(tidyverse)
library(ggcorrplot)
library(reshape2)
iris %>%
group_by(Species) %>%
summarise(correlation = list(cor(across(where(is.numeric))))) %>%
ungroup() %>%
mutate(correlation_df = map(correlation, ~ melt(.x, varnames = c("Var1", "Var2")))) %>%
select(Species, correlation_df) %>%
unnest(correlation_df) %>%
ggplot(aes(x = Var1, y = Var2, fill = value)) +
geom_tile() +
scale_fill_gradient2(limit = c(-1, 1)) +
labs(x = NULL,
y = NULL,
fill = NULL) +
theme_bw() +
facet_wrap(~Species)
Usando resposta de pergunta SO semelhante
(observe que a barra de cores se estende até as áreas de texto do título e do eixo)
make_fullsize <- function() structure("", class = "fullsizebar")
ggplot_add.fullsizebar <- function(obj, g, name = "fullsizebar") {
h <- ggplotGrob(g)$heights
panel <- which(grid::unitType(h) == "null")
panel_height <- unit(1, "npc") - sum(h[-panel])
g +
guides(fill = guide_colorbar(barheight = panel_height,
title.position = "right")) +
theme(legend.title = element_text(angle = -90, hjust = 0.5))
}
iris %>%
group_by(Species) %>%
summarise(correlation = list(cor(across(where(is.numeric))))) %>%
ungroup() %>%
mutate(correlation_df = map(correlation, ~ melt(.x, varnames = c("Var1", "Var2")))) %>%
select(Species, correlation_df) %>%
unnest(correlation_df) %>%
ggplot(aes(x = Var1, y = Var2, fill = value)) +
geom_tile() +
scale_fill_gradient2(limit = c(-1, 1)) +
labs(x = NULL,
y = NULL,
fill = NULL) +
theme_bw() +
coord_cartesian(expand = FALSE) +
make_fullsize() +
facet_wrap(~Species)
Criado em 2024-12-30 com reprex v2.1.1
Editado com base no comentário de Allan Cameron:
Ao atribuir a unidade a nulo dentro do
legend.key.height
parâmetro, o guia não só se ajusta verticalmente ao gráfico, mas também se estica se você alterar a proporção do gráfico. De acordo com este artigo do tidyverse.org, esse recurso ainda é experimental.(Edição baseada no comentário de Allan Cameron) Você pode então adicionar
legend.margin = margin(0, 0, 0, 0)
dentro do tema para que a legenda fique alinhada verticalmente com a parte superior e inferior do gráfico.Saída: