How can I make the legend in ggplot2 the same height as my plot? How can I make the legend in ggplot2 the same height as my plot? r r

How can I make the legend in ggplot2 the same height as my plot?


Edit Updating to ggplot v3.0.0

This is messy, but based on this answer, and delving deeper into the ggplot grob, the legend can be positioned precisely.

# Load the needed librarieslibrary(ggplot2)library(gtable)  # library(grid)library(scales)library(reshape2)# Generate a collection of sample datavariables = c("Var1", "Var2", "Var3")data = matrix(runif(9, -1, 1), 3, 3)diag(data) = 1colnames(data) = variablesrownames(data) = variables# Generate the plotcorrs = dataplot  = ggplot(melt(corrs), aes(x = Var1, y = Var2, fill = value)) +    geom_tile() +   theme_bw() +    theme(panel.border = element_blank()) +   theme(axis.text.x = element_text(angle = 90, vjust = 0.5, hjust = 1)) +   theme(aspect.ratio = 1) +   # theme(legend.position = "right", legend.key.height = unit(1, "inch")) +   labs(x = "", y = "", fill = "", title = "Correlation Coefficients") +   scale_fill_gradient2(limits = c(-1, 1), breaks = c(-1, -.5, 0, .5, 1), expand = c(0,0),       low = muted("red"), mid = "black", high = muted("blue")) +  # Modified line   geom_text(parse = TRUE, aes(label = sprintf("%.2f", value)), size = 3, color = "white") +   scale_x_discrete(expand = c(0,0)) +  # New line   scale_y_discrete(expand = c(0,0))    # New lineplot# Get the ggplot grobgt = ggplotGrob(plot)# Get the legendleg = gtable_filter(gt, "guide-box")# Raster heightleg[[1]][[1]][[1]][[1]][[1]][[2]]$height = unit(1, "npc")# Positions for labels and tick marks - five breaks, therefore, five positionspos = unit.c(unit(0.01,"npc"), unit(.25, "npc"), unit(.5, "npc"), unit(.75, "npc"), unit(.99, "npc"))# Positions the labels leg[[1]][[1]][[1]][[1]][[1]][[3]]$children[[1]]$y = pos# Positions the tick marksleg[[1]][[1]][[1]][[1]][[1]][[5]]$y0 = posleg[[1]][[1]][[1]][[1]][[1]][[5]]$y1 = pos# Legend key height ?leg[[1]][[1]][[1]][[1]]$heights = unit.c(rep(unit(0, "mm"), 3),                                         unit(1, "npc"),                                         unit(0, "mm"))# Legend heightleg[[1]][[1]]$heights[[3]] = sum(rep(unit(0, "mm"), 3),                                 unit(1, "npc"),                                 unit(0, "mm"))# grid.draw(leg)  # Check on heights and y values# gtable_show_layout(gt) # Manually locate position of legend in layoutgt.new = gtable_add_grob(gt, leg, t = 7, l = 9)# Draw itgrid.newpage()grid.draw(gt.new)

enter image description here


It seems quite tricky, the closest I got was this,

## panel height is 1null, so we work it out by subtracting the other heights from 1npc## and 1line for the default plot marginspanel_height = unit(1,"npc") - sum(ggplotGrob(plot)[["heights"]][-3]) - unit(1,"line")plot + guides(fill= guide_colorbar(barheight=panel_height))

unfortunately the vertical justification is a bit off.