J. Doe
J. Doe

Reputation: 1740

How to draw an empty ggplot with just the legend?

My question is very similar to this question, but it's not the same.

I am looking for a way to create an empty ggplot with just the legend. However, in contrast to the autohor of the question I linked at the top, I actually need to create just the legend with no plot area included in the image.

I tried the following code:

ggplot(NULL, aes(color = ""))+
    geom_blank()+
    scale_color_manual(values = "black", labels = "Something")+
    guides(color = guide_legend())+
    theme(legend.box.background = element_rect(color = "black"))

But I'm getting the opposite of what I want - I am getting an empty plot area with no legend, like this:

enter image description here

And I would like my end result to look like this (I drew this in Paint):

enter image description here

Any help would be appreciated!

Upvotes: 4

Views: 2502

Answers (2)

Liman
Liman

Reputation: 1300

enter image description here

You can make a normal plot, then play with theme to achieve the desired result.

library(ggplot2)

ggplot(data.frame(x = 1, y = 1, colour = 'Something'), aes(x, y, fill = colour))+
  geom_point(alpha=0, shape = 0)+ # completely transparent rectangular point 
  scale_fill_manual(values='black', drop=FALSE) +
  guides(fill = guide_legend(override.aes = list(alpha=1, size = 40)))+ # showing the point in the legend
  theme(axis.title = element_blank(),
        axis.text = element_blank(),
        axis.ticks = element_blank(),
        legend.position = c(0.5, 0.5), # move the legend to the center
        legend.title = element_blank(),
        legend.text = element_text(size = 40),
        legend.key = element_rect(fill='NA'),
        panel.grid = element_blank(),
        panel.border = element_rect(colour = "black", fill='white', size=1)
  )

Upvotes: 8

Allan Cameron
Allan Cameron

Reputation: 173928

Get the legend how you want it to look, then extract it with cowplot::get_legend:

library(grid)
library(cowplot)
library(ggplot2)

grid.newpage()
grid.draw(get_legend(
  ggplot(data.frame(x = 1, y = 1), aes(x, y, fill = "Something")) +
    geom_col(size = 20)+
    scale_fill_manual(values = "white", labels = "Something", name = "") +
    theme_bw() +
    theme(legend.box.background = element_rect(color = "black"),
          legend.title = element_text(size = 30),
          legend.key.size = unit(60, "points"),
          legend.text = element_text(size = 24),
          legend.key = element_rect(colour = "black"),
          legend.box.margin = margin(20, 20, 20, 20))))

enter image description here

Upvotes: 3

Related Questions