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()

3voto

Niels Holst Punkte 496

Beachten Sie auch ggarrange von der ggpubr Paket. Es bietet viele Vorteile, darunter Optionen zum Ausrichten von Achsen zwischen Diagrammen und zum Zusammenführen gemeinsamer Legenden zu einer einzigen.

1voto

IVIM Punkte 1663

Die obigen Lösungen sind möglicherweise nicht effizient, wenn Sie mehrere ggplot-Plots in einer Schleife darstellen wollen (z. B. wie hier gefragt: Erstellen mehrerer Diagramme in ggplot mit unterschiedlichen Y-Achsenwerten mithilfe einer Schleife ), was ein gewünschter Schritt bei der Analyse unbekannter (oder großer) Datensätze ist (z. B. wenn Sie die Anzahl aller Variablen in einem Datensatz darstellen möchten).

Der nachstehende Code zeigt, wie dies mit der oben erwähnten Funktion "multiplot()" zu bewerkstelligen ist, deren Quelle hier zu finden ist: http://www.cookbook-r.com/Graphs/Multiple_graphs_on_one_page_(ggplot2) :

plotAllCounts <- function (dt){   
  plots <- list();
  for(i in 1:ncol(dt)) {
    strX = names(dt)[i]
    print(sprintf("%i: strX = %s", i, strX))
    plots[[i]] <- ggplot(dt) + xlab(strX) +
      geom_point(aes_string(strX),stat="count")
  }

  columnsToPlot <- floor(sqrt(ncol(dt)))
  multiplot(plotlist = plots, cols = columnsToPlot)
}

Führen Sie nun die Funktion aus, um die Zählungen für alle mit ggplot gedruckten Variablen auf einer Seite zu erhalten

dt = ggplot2::diamonds
plotAllCounts(dt)

Eine Sache, die zu beachten ist, ist die:
mit aes(get(strX)) die Sie normalerweise in Schleifen verwenden würden, wenn Sie mit ggplot in dem obigen Code anstelle von aes_string(strX) wird NICHT die gewünschten Plots zeichnen. Stattdessen wird der letzte Plot viele Male gezeichnet. Ich habe nicht herausgefunden, warum das so ist - vielleicht hat es mit dem aes y aes_string werden aufgerufen in ggplot .

Ansonsten hoffe ich, dass Sie die Funktion nützlich finden werden.

1voto

Mayank Agrawal Punkte 37

Nach meiner Erfahrung funktioniert gridExtra:grid.arrange perfekt, wenn Sie versuchen, Plots in einer Schleife zu erzeugen.

Kurzer Codeschnipsel:

gridExtra::grid.arrange(plot1, plot2, ncol = 2)

** Aktualisierung dieses Kommentars, um zu zeigen, wie man grid.arrange() innerhalb einer for-Schleife, um Diagramme für verschiedene Faktoren einer kategorialen Variable zu erstellen.

for (bin_i in levels(athlete_clean$BMI_cat)) {

plot_BMI <- athlete_clean %>% filter(BMI_cat == bin_i) %>% group_by(BMI_cat,Team) %>% summarize(count_BMI_team = n()) %>% 
          mutate(percentage_cbmiT = round(count_BMI_team/sum(count_BMI_team) * 100,2)) %>% 
          arrange(-count_BMI_team) %>% top_n(10,count_BMI_team) %>% 
          ggplot(aes(x = reorder(Team,count_BMI_team), y = count_BMI_team, fill = Team)) +
            geom_bar(stat = "identity") +
            theme_bw() +
            # facet_wrap(~Medal) +
            labs(title = paste("Top 10 Participating Teams with \n",bin_i," BMI",sep=""), y = "Number of Athletes", 
                 x = paste("Teams - ",bin_i," BMI Category", sep="")) +
            geom_text(aes(label = paste(percentage_cbmiT,"%",sep = "")), 
                      size = 3, check_overlap = T,  position = position_stack(vjust = 0.7) ) +
            theme(axis.text.x = element_text(angle = 00, vjust = 0.5), plot.title = element_text(hjust = 0.5), legend.position = "none") +
            coord_flip()

plot_BMI_Medal <- athlete_clean %>% 
          filter(!is.na(Medal), BMI_cat == bin_i) %>% 
          group_by(BMI_cat,Team) %>% 
          summarize(count_BMI_team = n()) %>% 
          mutate(percentage_cbmiT = round(count_BMI_team/sum(count_BMI_team) * 100,2)) %>% 
          arrange(-count_BMI_team) %>% top_n(10,count_BMI_team) %>% 
          ggplot(aes(x = reorder(Team,count_BMI_team), y = count_BMI_team, fill = Team)) +
            geom_bar(stat = "identity") +
            theme_bw() +
            # facet_wrap(~Medal) +
            labs(title = paste("Top 10 Winning Teams with \n",bin_i," BMI",sep=""), y = "Number of Athletes", 
                 x = paste("Teams - ",bin_i," BMI Category", sep="")) +
            geom_text(aes(label = paste(percentage_cbmiT,"%",sep = "")), 
                      size = 3, check_overlap = T,  position = position_stack(vjust = 0.7) ) +
            theme(axis.text.x = element_text(angle = 00, vjust = 0.5), plot.title = element_text(hjust = 0.5), legend.position = "none") +
            coord_flip()

gridExtra::grid.arrange(plot_BMI, plot_BMI_Medal, ncol = 2)

}

Nachfolgend ist eines der Beispielplots aus der oben genannten for-Schleife zu sehen. Die obige Schleife erzeugt mehrere Diagramme für alle Stufen der BMI-Kategorie.

Beispielbild

Wenn Sie eine umfassendere Verwendung von grid.arrange() innerhalb for Schleifen, siehe https://rpubs.com/Mayank7j_2020/olympic_data_2000_2016

-2voto

tim Punkte 3264

En cowplot Paket bietet Ihnen eine gute Möglichkeit, dies auf eine für die Veröffentlichung geeignete Weise zu tun.

x <- rnorm(100)
eps <- rnorm(100,0,.2)
A = qplot(x,3*x+eps, geom = c("point", "smooth"))+theme_gray()
B = qplot(x,2*x+eps, geom = c("point", "smooth"))+theme_gray()
cowplot::plot_grid(A, B, labels = c("A", "B"), align = "v")

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