ich eine kombinierte Handlung von zwei Parzellen + ihre Legende wie diese wollen:ggplot2: mehrere Plots in einer einzigen Zeile mit einer einzigen Legende
library(ggplot2)
library(grid)
library(gridExtra)
dsamp <- diamonds[sample(nrow(diamonds), 1000), ]
p1 <- qplot(price, carat, data=dsamp, colour=clarity)
p2 <- qplot(price, depth, data=dsamp, colour=clarity)
g <- ggplotGrob(p1 + theme(legend.position="bottom"))$grobs
legend <- g[[which(sapply(g, function(x) x$name) == "guide-box")]]
grid.arrange(arrangeGrob(p1+theme(legend.position="right"),p2+theme(legend.position="none"),legend,ncol=3,widths=c(3/7,3/7,1/7)))
Allerdings möchte ich nicht über die Breite erraten der Plots und Legenden (und spezifizieren ncol
), aber haben es aus p1
und p2
as shown here extrahiert.
Also erwarte ich, ich würde (von der Verbindung angepasst Code) so etwas wie dieser benötigen:
grid_arrange_shared_legend_row <- function(...) {
plots <- list(...)
g <- ggplotGrob(plots[[1]] + theme(legend.position="right"))$grobs
legend <- g[[which(sapply(g, function(x) x$name) == "guide-box")]]
lwidth <- sum(legend$width)
grid.arrange(
do.call(arrangeGrob, lapply(plots, function(x)
x + theme(legend.position="none"))),
legend,
ncol = length(plots)+1,
widths = unit.c(rep(unit(1, "npc") - lwidth, length(plots)), lwidth))
}
grid_arrange_shared_legend_row(p1, p2)
aber dies ist die zwei Grundstücke in einer Zeile nicht arrangieren, sondern eine Spalte:
Diese Frage ist ähnlich to this one here aber anders, dass ich für die angepassten Breiten auch frage. Ich verwende Code-Extrakte sowohl aus dieser Frage + Antwort als auch aus dem GitHub.
Vielen Dank, das funktioniert wirklich gut. Vielleicht solltest du auch die andere Frage mit dem gleichen Code beantworten? Es war ziemlich hoch meine Google-Ergebnisse und wäre eine gute Referenz für zukünftige Nutzer! – mts