Supposons que vous souhaitiez créer une figure comme celle ci-dessous.
Je souhaite utiliser le fonction multiplot , basée sur ggplot2
. Comment puis-je ajouter des graphiques vides pour obtenir la sortie triangulaire avec multiplot?
MWE ci-dessous:
library(ggplot2) # Multiplot function from http://www.cookbook-r.com/Graphs/Multiple_graphs_on_one_page_(ggplot2)/ multiplot <- function(..., plotlist=NULL, file, cols=1, layout=NULL) { library(grid) # Make a list from the ... arguments and plotlist plots <- c(list(...), plotlist) numPlots = length(plots) # If layout is NULL, then use 'cols' to determine layout if (is.null(layout)) { # Make the panel # ncol: Number of columns of plots # nrow: Number of rows needed, calculated from # of cols layout <- matrix(seq(1, cols * ceiling(numPlots/cols)), ncol = cols, nrow = ceiling(numPlots/cols)) } if (numPlots==1) { print(plots[[1]]) } else { # Set up the page grid.newpage() pushViewport(viewport(layout = grid.layout(nrow(layout), ncol(layout)))) # Make each plot, in the correct location for (i in 1:numPlots) { # Get the i,j matrix positions of the regions that contain this subplot matchidx <- as.data.frame(which(layout == i, arr.ind = TRUE)) print(plots[[i]], vp = viewport(layout.pos.row = matchidx$row, layout.pos.col = matchidx$col)) } } } # Example plot p <- ggplot(data = mtcars, aes(x=wt, y=mpg)) + geom_point() multiplot(p,p,p,p,p,p,p,p,p,cols=3)
Cela produit
3 Réponses :
alternativement, grid.arrange () peut utiliser une mise en page,
m = matrix(NA, 3, 3) m[upper.tri(m, TRUE)] = 1:6 lp = replicate(6, ggplot(), FALSE) gridExtra::grid.arrange(grobs = lp, layout_matrix = m)
Depuis la mise en place de la fonction multiplot
, plusieurs packages sont sortis qui prennent en charge des tâches comme celle-ci et ont plus de fonctionnalités, y compris cowplot
, egg
et patchwork . Je pense que patchwork
est le mieux adapté à cette tâche en raison de la façon dont il construit les grilles, et en raison de sa fonction plot_spacer
qui crée des objets ggplot
vides pour
patchwork
a un ensemble d'arithmétique pour assembler des graphiques, mais +
est le plus simple. Votre code que vous avez déjà deviendrait celui-ci:
diag_label <- function(data, mapping) { var_name <- quo_name(mapping[[1]]) ggplot(data, mapping) + ggally_text(var_name, color = "black") } ggpairs(df, columns = 2:ncol(df), upper = list(continuous = "points"), lower = list(continuous = "blank"), diag = list(continuous = diag_label), progress = FALSE) + theme_bw()
Cependant, l'exemple que vous avez publié au début est plus complexe, car il contient plusieurs variables affichées les unes par rapport aux autres. Vous pouvez le construire en patchwork
, idéalement avec un tidyeval pour simplifier plusieurs appels ggplot
, ou vous pouvez utiliser une fonction de matrice de nuage de points, telle que celle de GGally .
J'ai créé un ensemble de données plus complexe, plus proche de ce qui aurait été utilisé dans votre exemple principal.
library(dplyr) library(purrr) library(tidyr) library(GGally) df <- tibble( id = rep(1:100, times = 4), key = rep(letters[1:4], each = 100), value = map(1:4, ~rnorm(100, mean = .)) %>% reduce(c) ) %>% spread(key, value) head(df) #> # A tibble: 6 x 5 #> id a b c d #> <int> <dbl> <dbl> <dbl> <dbl> #> 1 1 1.89 0.912 2.96 4.92 #> 2 2 2.58 1.12 3.38 3.85 #> 3 3 0.730 2.92 2.64 5.16 #> 4 4 2.04 4.30 2.63 5.85 #> 5 5 1.28 1.41 3.82 3.35 #> 6 6 1.77 1.60 2.79 5.54
Pour les étiquettes diagonales, J'ai construit un geom personnalisé en utilisant les fonctions d'assistance de GGally
et un peu de tidyeval ( quo_name
). Cela vous donnera une étiquette sur la diagonale de la matrice, au lieu du graphique de densité par défaut.
library(ggplot2) library(patchwork) p <- ggplot(data = mtcars, aes(x=wt, y=mpg)) + geom_point() s <- plot_spacer() p + p + p + s + p + p + s + s + p + plot_layout(ncol = 3, nrow = 3)
Il y a beaucoup plus que vous pouvez modifier pour que les axes et les étiquettes ressemblent à ce premier exemple.
Superbe! Merci! Surtout le point commun des axes!
Vous venez de publier un commentaire sur ma réponse tex.stackexchange.com/questions/424650/… J'ai quitté tex.se il y a un moment, donc je ne répondrai pas Toi là. Avez-vous compilé 2 fois? Le
\ begin {frame} [label = ....]
est généralement plus puissant pour beamer car ces libellés peuvent également être utilisés pour des choses comme\ againframe
, pas de soucis pour superpositions, etc. Pouvez-vous faire un MWE de ce que vous avez essayé et n'a pas fonctionné?@samcarter Comme c'est étrange. Cela fonctionne dans votre MWE mais pas dans ma présentation actuelle (assez longue). Il est probablement inutile de déboguer mes diapositives (et pour être honnête, je n'ai pas le temps pour le moment). Si personne d'autre ne s'est plaint, c'est mon problème. : /