Der Ansatz ähnelt Sandys, da er die Legende als separate Objekte entfernt und Sie die Platzierung unabhängig voneinander durchführen können. Es wurde hauptsächlich für mehrere Legenden entworfen, die zu zwei oder mehr Plots in einem Raster von Plots gehören.
Es scheint irgendwie kompliziert und zeit-/code-komplex, aber einmal eingerichtet, kannst du es für jede Art von Plot/Legendenanpassung anpassen und verwenden.
library(ggplot2)
library(cowplot)
# set up function
g_legend<-function(a.gplot){
tmp <- ggplot_gtable(ggplot_build(a.gplot))
leg <- which(sapply(tmp$grobs, function(x) x$name) == "guide-box")
legend <- tmp$grobs[[leg]]
return(legend) }
# Some data
df <- data.frame(
Name = factor(rep(c("A", "B", "C"), 12)),
Month = factor(rep(1:12, each=3)),
Temp = sample(0:40, 12),
Precip = sample(50:400, 12))
# create plot1
plot1 <- ggplot(df, aes(Month, Temp, fill = Name)) +
geom_point(show.legend = F, aes(group = Name, colour = Name),
size = 3, shape = 17) +
geom_smooth(method = "loess", se = F,
aes(group = Name, colour = Name),
show.legend = F, size = 0.5, linetype = "dashed")
# create plot2
plot2 <- ggplot(df, aes(Month, Precip, fill = Name)) +
geom_bar(stat = "identity", position = "dodge", show.legend = F) +
geom_smooth(method = "loess", se = F,
aes(group = Name, colour = Name),
show.legend = F, size = 1, linetype = "dashed") +
scale_fill_grey()
# create legend1
legend1 <- ggplot(df, aes(Month, Temp)) +
geom_point(show.legend = T, aes(group = Name, colour = Name),
size = 3, shape = 17) +
geom_smooth(method = "loess", se = F,aes(group = Name, colour = Name),
show.legend = T, size = 0.5, linetype = "dashed") +
labs(colour = "Station") +
theme(legend.text=element_text(size=8),
legend.title = element_text(face = "italic",
angle = -0, size = 10))
# create legend2
legend2 <- ggplot(df, aes(Month, Precip, fill = Name)) +
geom_bar(stat = "identity", position = "dodge", show.legend = T) +
scale_fill_grey() +
guides(fill =
guide_legend(title = "",
title.theme = element_text(face = "italic",
angle = -0, size = 10))) +
theme(legend.text=element_text(size=8))
# extract "legends only" from ggplot object
legend1 <- g_legend(legend1)
legend2 <- g_legend(legend2)
# setup legends grid
legend1_grid <- cowplot::plot_grid(legend1, align = "v", nrow = 2)
# add second legend to grid, specifying its location
legends <- legend1_grid +
ggplot2::annotation_custom(grob = legend2,
xmin = 0.5, xmax = 0.5, ymin = 0.55, ymax = 0.55)
# plot "plots" + "legends" (with legends in between plots)
cowplot::plot_grid(plot1, legends, plot2, ncol = 3,
rel_widths = c(0.45, 0.1, 0.45))
Ich denke nicht, dass es möglich ist (wo die Legenden platziert werden, wird durch das Thema gesteuert, und die Teile, die die Legendenposition definieren, nehmen nur einen einzigen Wert an). Ich bin mir aber nicht so sicher, dass es nicht möglich ist, eine Antwort zu geben. –
Raten Sie, wenn es war, wäre einer der Experten jetzt auf – pssguy
@pssguy gewesen, es kann mit etwas Fiedeln getan werden. Um die Legenden steuern zu können, müssen Sie separate Legenden extrahieren, die dann in einem Diagramm angeordnet werden können, das anfangs keine Legende enthält. –