J'ai le facet_wrap
fonction pour créer plusieurs graphiques (n = ~ 51) mais ils apparaissent tous sur une seule page. Maintenant, après la recherche, j'ai découvert que ggplot2 ne peut pas placer de graphiques sur plusieurs pages.
Y a-t-il un moyen de faire cela? J'ai regardé cette question ( plusieurs graphiques sur plusieurs pages en utilisant ggplot ) et j'ai essayé le code, avec peu de succès.
Voici mon code pour mes graphiques, il produit ~ 51 graphiques sur une page, ce qui les rend très petits et difficiles à voir, si je pouvais imprimer ceci sur 1 graphique par page dans un pdf, ce serait génial:
ggplot(indbill, aes(x = prey, y = weight), tab) +
geom_polygon(aes(group = load, color = capture), fill = NA, size = 0.75) +
facet_wrap(~ individual) +
theme(axis.ticks.x = element_blank(),
axis.text.x = element_text(size=rel(0.5)),
axis.ticks.y = element_blank(),
axis.text.y = element_blank()) +
xlab("") + ylab("") +
guides(color = guide_legend(ncol=2)) +
coord_radar()
Si quelqu'un pouvait écrire un petit code et me l'expliquer, ce serait bien.
Une option consiste à tracer, disons, six niveaux de individual
à la fois en utilisant le même code que vous utilisez maintenant. Vous aurez juste besoin de l'itérer plusieurs fois, une fois pour chaque sous-ensemble de vos données. Vous n'avez pas fourni d'exemples de données, voici donc un exemple utilisant le cadre de données Baseball
:
library(ggplot2)
library(vcd) # For the Baseball data
data(Baseball)
pdf("baseball.pdf", 7, 5)
for (i in seq(1, length(unique(Baseball$team87)), 6)) {
print(ggplot(Baseball[Baseball$team87 %in% levels(Baseball$team87)[i:(i+5)], ],
aes(hits86, sal87)) +
geom_point() +
facet_wrap(~ team87) +
scale_y_continuous(limits=c(0, max(Baseball$sal87, na.rm=TRUE))) +
scale_x_continuous(limits=c(0, max(Baseball$hits86))) +
theme_bw())
}
dev.off()
Le code ci-dessus produira un fichier PDF avec quatre pages de tracés, chacune avec six facettes sur une page. Vous pouvez également créer quatre fichiers PDF PDF $, un pour chaque groupe de six facettes:
for (i in seq(1, length(unique(Baseball$team87)), 6)) {
pdf(paste0("baseball_",i,".pdf"), 7, 5)
...ggplot code...
dev.off()
}
Une autre option, si vous avez besoin de plus de flexibilité, consiste à créer un tracé séparé pour chaque niveau (c'est-à-dire, chaque valeur unique) de la variable de facettage et à enregistrer tous les tracés individuels dans une liste. Ensuite, vous pouvez disposer n'importe quel nombre de tracés sur chaque page. C'est probablement exagéré ici, mais voici un exemple où la flexibilité est utile.
Commençons par créer tous les tracés. Nous utiliserons team87
comme colonne à facettes. Nous voulons donc créer un graphique pour chaque niveau de team87
. Nous allons le faire en divisant les données par team87
et créer un tracé séparé pour chaque sous-ensemble de données.
Dans le code ci-dessous, split
divise les données en trames de données distinctes pour chaque niveau de team87
. L'encapsuleur lapply
alimente séquentiellement chaque sous-ensemble de données dans ggplot pour créer un tracé pour chaque équipe. Nous enregistrons la sortie dans plist
, une liste (dans ce cas) de 24 tracés.
plist = lapply(split(Baseball, Baseball$team87), function(d) {
ggplot(d, aes(hits86, sal87)) +
geom_point() +
facet_wrap(~ team87) +
scale_y_continuous(limits=c(0, max(Baseball$sal87, na.rm=TRUE))) +
scale_x_continuous(limits=c(0, max(Baseball$hits86))) +
theme_bw() +
theme(plot.margin=unit(rep(0.4,4),"lines"),
axis.title=element_blank())
})
Nous allons maintenant disposer six tracés à la fois dans un fichier PDF. Voici deux options, une avec quatre fichiers PDF chacun, avec six tracés, l'autre avec un seul fichier de quatre pages PDF. J'ai également collé dans l'un des tracés en bas. Nous utilisons grid.arrange
pour disposer les tracés, notamment en utilisant les arguments left
et bottom
pour ajouter des titres d'axe.
library(gridExtra)
# Four separate single-page PDF files, each with six plots
for (i in seq(1, length(plist), 6)) {
pdf(paste0("baseball_",i,".pdf"), 7, 5)
grid.arrange(grobs=plist[i:(i+5)],
ncol=3, left="Salary 1987", bottom="Hits 1986")
dev.off()
}
# Four pages of plots in one PDF file
pdf("baseball.pdf", 7, 5)
for (i in seq(1, length(plist), 6)) {
grid.arrange(grobs=plist[i:(i+5)],
ncol=3, left="Salary 1987", bottom="Hits 1986")
}
dev.off()
Il existe plusieurs façons de faire la pagination: ggforce ou gridExtra :: marrangeGrob . Voir aussi ceci réponse pour un autre exemple.
library(ggplot2)
library(ggforce)
# Standard facetting: too many small plots
ggplot(diamonds) +
geom_point(aes(carat, price), alpha = 0.1) +
facet_wrap(~cut:clarity, ncol = 3)
# Pagination: page 1
ggplot(diamonds) +
geom_point(aes(carat, price), alpha = 0.1) +
facet_wrap_paginate(~cut:clarity, ncol = 3, nrow = 3, page = 1)
# Pagination: page 2
ggplot(diamonds) +
geom_point(aes(carat, price), alpha = 0.1) +
facet_wrap_paginate(~cut:clarity, ncol = 3, nrow = 3, page = 2)
# Works with grid as well
ggplot(diamonds) +
geom_point(aes(carat, price), alpha = 0.1) +
facet_grid_paginate(color~cut:clarity, ncol = 3, nrow = 3, page = 4)
library(gridExtra)
set.seed(123)
pl <- lapply(1:11, function(.x)
qplot(1:10, rnorm(10), main=paste("plot", .x)))
ml <- marrangeGrob(pl, nrow=2, ncol=2)
## non-interactive use, multipage pdf
## ggsave("multipage.pdf", ml)
## interactive use; calling `dev.new` multiple times
ml
Créé le 2018-08-09 par le package reprex (v0.2.0.9000).
quelque chose comme :
by(indbill, indbill$individual, function (x){
ggplot(x, aes(x = prey, y = weight), tab) +
geom_polygon(aes(group = load, color = capture), fill = NA, size = 0.75) +
theme(axis.ticks.x = element_blank(),
axis.text.x = element_text(size=rel(0.5)),
axis.ticks.y = element_blank(),
axis.text.y = element_blank()) +
xlab("") + ylab("") +
guides(color = guide_legend(ncol=2)) +
coord_radar()
}