I'm trying to get a plot with two legends, one at the bottom and the other at the right side of the plot.
library(tidyverse)
df <- tibble(names = mtcars %>%
rownames(),
mtcars)
#plot 1
p1 <- df %>%
filter(names == "Duster 360" | names == "Valiant") %>%
ggplot(aes(x = as.factor(cyl), y = mpg, color = names)) +
geom_point() +
geom_hline(aes(yintercept = 20, linetype = "a")) +
theme(legend.position = "bottom")
p1
Desired plot (legend should be outside of plot):
Update
As of ggplot2 >= 3.5.0
there is no longer a need for hacky approaches., Instead it is now possible to place the legends individually using the position=
argument of the guides (see here):
library(ggplot2)
df <- mtcars
df$names <- rownames(mtcars)
df <- subset(df, names == "Duster 360" | names == "Valiant")
ggplot(df, aes(x = as.factor(cyl), y = mpg, color = names)) +
geom_point() +
geom_hline(aes(yintercept = 20, linetype = "a")) +
guides(
color = guide_legend(position = "right"),
linetype = guide_legend(position = "bottom")
)
Original Answer
Making use of cowplot
you could do:
color
guide from a plot without a linetype
guide and legend.position = "right"
using cowplot::get_legend
cowplot::plot_grid
make a grid with two columns where the first column contains the plot without the color
guide and the linetype
guide placed at the bottom, while the color
guide is put in the second column.library(tidyverse)
df <- tibble(names = mtcars %>%
rownames(),
mtcars)
p1 <- df %>%
filter(names == "Duster 360" | names == "Valiant") %>%
ggplot(aes(x = as.factor(cyl), y = mpg, color = names)) +
geom_point() +
geom_hline(aes(yintercept = 20, linetype = "a"))
library(cowplot)
guide_color <- get_legend(p1 + guides(linetype = "none"))
plot_grid(p1 +
guides(color = "none") +
theme(legend.position = "bottom"),
guide_color,
ncol = 2, rel_widths = c(.85, .15))