Éviter de perdre de l'espace lors de la passation de plusieurs parcelles alignées sur une seule page
J'aimerais lieu de quatre parcelles sur une seule page. Les étiquettes de l'axe doivent être imprimés uniquement à la jante, c'est à dire x les étiquettes d'axe pour le bas des diagrammes seulement, et y les étiquettes d'axe pour la gauche diagrammes seulement. Cela va à la fois pour le nom de l'axe comme un tout et l'individu marques de graduation. Je peux générer quelque chose le long de ces lignes en utilisant le code suivant:
pdf(file = "ExampleOutput.pdf",
width = 6.61,
height = 6.61,
pointsize = 10
)
set.seed(42)
catA <- factor(c("m100", "m500", "m1000", "m2000", "m3000", "m5000"))
catB <- factor(20:28)
samples <- 100
rsample <- function(v) v[ceiling(runif(samples, max=length(v)))]
Tab <- data.frame(catA = rsample(catA),
catB = rsample(catB),
valA = rnorm(samples, 150, 8),
valB = pmin(1,pmax(0,rnorm(samples, 0.5, 0.3))))
par(mfrow = c(2,2))
for (i in 0:3) {
x <- Tab[[1 + i %% 2]]
plot(x, Tab[[3 + i %/% 2]],
xlab = if (i %/% 2 == 1) "Some Categories" else NULL,
ylab = if (i %% 2 == 0) "Some Values" else NULL,
axes = FALSE
)
axis(side = 1,
at=1:nlevels(x),
labels = if (i %/% 2 == 1) levels(x) else FALSE)
axis(side = 2, labels = (i %% 2 == 0))
box(which = "plot", bty = "l")
}
par(mfrow = c(1,1))
dev.off()
Je vais accueillir des suggestions sur la façon d'améliorer mon ploting commandes, peut-être éviter les draing les axes et les L dans le coin inférieur gauche manuellement. Mais c'est seulement une outre.
Le résultat de cette séquence ressemble à ceci:
Le problème ici, c'est la énorme quantité de gaspillage d'espace. J'ai l'impression que R réserve de l'espace pour l'axe et les étiquettes de graduation, même si ils ne sont pas utilisés. En conséquence de ce gaspillage de l'espace, pour la gauche, le bas du schéma, que tous les deux x tique devient vraiment marqué, ce qui est vraiment mauvais ici.
Je voudrais générer une parcelle semblable, sans que beaucoup d'espace blanc. La réelle parcelles doit être de la même taille, de sorte qu'ils sont alignés correctement, mais l'espace pour les étiquettes doivent être uniquement à l'extérieur. J'imagine une mise en page qui ressemble à ceci (maquette créée dans GIMP):
Comment puis-je parvenir à une telle mise en page?
Vous devez vous connecter pour publier un commentaire.
Ici est une légère modification de la trame générale que vous montrez, en supposant que l'axe des x et l'axe des étiquettes se rapportent à toutes les parcelles. Il utilise une marge extérieure pour contenir l'axe de l'étiquetage, ce qui nous ajouter avec
title()
à l'aide de l'argumentouter = TRUE
. L'effet est un peu comme l'étiquetage dans ggplot2 ou treillis parcelles.La clé ici est:
qui définit la parcelle paramètres (les valeurs en place avant l'appel sont stockées dans
op
). Nous utilisons5
et4
lignes sur les côtés 1 et 2 de la marge extérieure, qui est le nombre habituel de lamar
paramètre. L'intrigue de la région de marges (mar
) de 1 ligne de chaque sont ajoutées en haut et à droite, pour donner un peu d'espace entre les parcelles.Les étiquettes de l'axe sont ajoutés après la
for()
boucle avecL'intégralité du script est:
qui produit
oma
etmar
semblent indiquer un précieux sens en tout cas.par(mfrow = c(2,2), oma = c(2, 2, 0, 0), mar = c(1, 1, 0, 0), mgp = c(2, 1, 0), xpd = NA)
. N'hésitez pas à inclure dans votre réponse, et merci beaucoup!cex.axis
permettrait de résoudre ce problème, comme la rotation des étiquettes aveclas
et de donner un peu plus de place sur le fond externe de la marge.Bâtiment lourdement sur la réponse de Gavin Simpson, je vais maintenant utiliser la solution suivante:
Le résultat ressemble à ceci:
Comme vous pouvez le voir, ce qui est suffisant pour permettre l'impression des étiquettes de graduation ainsi. Si elle n'était pas, alors, selon Gavin commentaire, ajoutant
cex.axis
avec une valeur inférieure à 1 pour la liste des paramètres devraient contribuer à réduire la taille de la police n'.Juste manipuler vos paramètres, dans
par
. L'argumentmar
contrôles de la taille de la marge pour chaque parcelle. Changer votrepar
à ceci:Vous avez besoin d'un conditionnel de l'évaluation qui assigne à
par('mar')
valeurs qui sont appropriés pour le positionnement; Voici un exemple de code (à l'intérieur de la boucle) qui vérifie que le "x-mise en page-position":Vous aurez besoin d'ajuster ce pour répondre à vos besoins, car il ne gère que deux marge conditions andy vous avez vraiment 4 conditions (2 ci-dessous à la fois besoin de plus de fond de l'espace, avec le droit que l'on ait besoin de moins d'espace et deux ci-dessus (également avec des exigences différentes) . Si vous réduisez la 'mar' valeur au niveau mondial, on va couper votre x et y des étiquettes comme on peut le voir dans la perte de la xlab valeurs lorsque vous seule goutte de ce code dans votre boucle.