449 Stimmen

Seite-an-Seite-Diagramme mit ggplot2

Ich möchte zwei Parzellen nebeneinander platzieren, indem ich die ggplot2-Paket , d.h. das Äquivalent von par(mfrow=c(1,2)) .

Ich möchte z. B. die folgenden beiden Diagramme mit demselben Maßstab nebeneinander anzeigen lassen.

x <- rnorm(100)
eps <- rnorm(100,0,.2)
qplot(x,3*x+eps)
qplot(x,2*x+eps)

Muss ich sie in denselben data.frame einfügen?

qplot(displ, hwy, data=mpg, facets = . ~ year) + geom_smooth()

17voto

Thierry Punkte 17544

Mit dem Paket reshape können Sie etwa so vorgehen.

library(ggplot2)
wide <- data.frame(x = rnorm(100), eps = rnorm(100, 0, .2))
wide$first <- with(wide, 3 * x + eps)
wide$second <- with(wide, 2 * x + eps)
long <- melt(wide, id.vars = c("x", "eps"))
ggplot(long, aes(x = x, y = value)) + geom_smooth() + geom_point() + facet_grid(.~ variable)

17voto

Tung Punkte 23110

Außerdem gibt es mehrteiliges Paket das erwähnenswert ist. Siehe auch dies Antwort .

library(ggplot2)
theme_set(theme_bw())

q1 <- ggplot(mtcars) + geom_point(aes(mpg, disp))
q2 <- ggplot(mtcars) + geom_boxplot(aes(gear, disp, group = gear))
q3 <- ggplot(mtcars) + geom_smooth(aes(disp, qsec))
q4 <- ggplot(mtcars) + geom_bar(aes(carb))

library(magrittr)
library(multipanelfigure)
figure1 <- multi_panel_figure(columns = 2, rows = 2, panel_label_type = "none")
# show the layout
figure1

figure1 %<>%
  fill_panel(q1, column = 1, row = 1) %<>%
  fill_panel(q2, column = 2, row = 1) %<>%
  fill_panel(q3, column = 1, row = 2) %<>%
  fill_panel(q4, column = 2, row = 2)
figure1

# complex layout
figure2 <- multi_panel_figure(columns = 3, rows = 3, panel_label_type = "upper-roman")
figure2

figure2 %<>%
  fill_panel(q1, column = 1:2, row = 1) %<>%
  fill_panel(q2, column = 3, row = 1) %<>%
  fill_panel(q3, column = 1, row = 2) %<>%
  fill_panel(q4, column = 2:3, row = 2:3)
figure2

Erstellt am 2018-07-06 von der Reprex-Paket (v0.2.0.9000).

15voto

baptiste Punkte 73413

Ggplot2 basiert auf Rastergrafiken, die ein anderes System für die Anordnung von Diagrammen auf einer Seite bieten. Die par(mfrow...) Befehl hat keine direkte Entsprechung, da Rasterobjekte (genannt grobs ) werden nicht unbedingt sofort gezeichnet, sondern können als reguläre R-Objekte gespeichert und manipuliert werden, bevor sie in eine grafische Ausgabe umgewandelt werden. Dies ermöglicht eine größere Flexibilität als bei der Zeichnen Sie das jetzt Modell der Basisgrafiken, aber die Strategie ist notwendigerweise ein wenig anders.

Ich schrieb grid.arrange() eine einfache Schnittstelle zu bieten, die so nah wie möglich an par(mfrow) . In seiner einfachsten Form würde der Code wie folgt aussehen:

library(ggplot2)
x <- rnorm(100)
eps <- rnorm(100,0,.2)
p1 <- qplot(x,3*x+eps)
p2 <- qplot(x,2*x+eps)

library(gridExtra)
grid.arrange(p1, p2, ncol = 2)

enter image description here

Weitere Optionen finden Sie unter diese Vignette .

Häufig wird beanstandet, dass Diagramme nicht unbedingt ausgerichtet sind, z. B. wenn sie Achsenbeschriftungen unterschiedlicher Größe haben, aber das ist beabsichtigt: grid.arrange macht keinen Versuch, ggplot2-Objekte zu spezialisieren, und behandelt sie genauso wie andere Grobs (z.B. Lattice Plots). Es platziert Grobs lediglich in einem rechteckigen Layout.

Für den speziellen Fall von ggplot2-Objekten habe ich eine weitere Funktion geschrieben, ggarrange mit einer ähnlichen Schnittstelle, die versucht, Plot-Panels (einschließlich facettierter Plots) auszurichten und die Seitenverhältnisse zu beachten, wenn sie vom Benutzer definiert wurden.

library(egg)
ggarrange(p1, p2, ncol = 2)

Beide Funktionen sind kompatibel mit ggsave() . Hier finden Sie einen allgemeinen Überblick über die verschiedenen Optionen und einen historischen Kontext, diese Vignette bietet zusätzliche Informationen .

10voto

Jeromy Anglim Punkte 32121

Aktualisierung: Diese Antwort ist sehr alt. gridExtra::grid.arrange() ist jetzt der empfohlene Ansatz. Ich lasse dies hier, falls es nützlich sein könnte.


Stephen Turner hat die arrange() Funktion bei Erledigung der Genetik Blog (siehe Beitrag für Bewerbungshinweise)

vp.layout <- function(x, y) viewport(layout.pos.row=x, layout.pos.col=y)
arrange <- function(..., nrow=NULL, ncol=NULL, as.table=FALSE) {
 dots <- list(...)
 n <- length(dots)
 if(is.null(nrow) & is.null(ncol)) { nrow = floor(n/2) ; ncol = ceiling(n/nrow)}
 if(is.null(nrow)) { nrow = ceiling(n/ncol)}
 if(is.null(ncol)) { ncol = ceiling(n/nrow)}
        ## NOTE see n2mfrow in grDevices for possible alternative
grid.newpage()
pushViewport(viewport(layout=grid.layout(nrow,ncol) ) )
 ii.p <- 1
 for(ii.row in seq(1, nrow)){
 ii.table.row <- ii.row 
 if(as.table) {ii.table.row <- nrow - ii.table.row + 1}
  for(ii.col in seq(1, ncol)){
   ii.table <- ii.p
   if(ii.p > n) break
   print(dots[[ii.table]], vp=vp.layout(ii.table.row, ii.col))
   ii.p <- ii.p + 1
  }
 }
}

9voto

shiny Punkte 3130

Verwendung von tidyverse :

x <- rnorm(100)
eps <- rnorm(100,0,.2)
df <- data.frame(x, eps) %>% 
  mutate(p1 = 3*x+eps, p2 = 2*x+eps) %>% 
  tidyr::gather("plot", "value", 3:4) %>% 
  ggplot(aes(x = x , y = value)) + 
    geom_point() + 
    geom_smooth() + 
    facet_wrap(~plot, ncol =2)

df

enter image description here

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X