web-dev-qa-db-fra.com

Grille cohérente avec les graduations sur l'axe

Je suis gêné de poser cette question simple, mais je me bouscule depuis plusieurs jours chaque fois que je crée un complot:

plot (x = 1:10, y = rnorm (10, 5, 2))
grid (10,10, lty = 6, col = "cornsilk2")

Je veux positionner les grilles juste à l'endroit où les axes sont étiquetés, c'est-à-dire à 2, 4, 6, 8, 10 dans l'axe x et de même 3, 4, 5, 6, 7, 8 dans l'axe y.

enter image description here

Je veux automatiser le processus chaque fois que la taille du tracé change, le comportement par défaut de l'étiquette change. Voir l'intrigue suivante:

enter image description here

26
jon

De ?grid description des arguments nx et ny:

Lorsque NULL, par défaut, la grille s'aligne avec les graduations sur l'axe par défaut correspondant (c'est-à-dire les graduations calculées par axTicks)

plot (x = 1:10, y = rnorm (10, 5, 2)) 
grid (NULL,NULL, lty = 6, col = "cornsilk2") 
37
joran

Pour référence, il existe un moyen de contrôler les paramètres de la grille et des axes directement à partir de la commande plot (), si nous ne définissons pas d'intervalle de tick personnalisé:

plot(x = 1:10, y = rnorm(10, 5, 2), xlim=c(1, 10), ylim=c(1, 10), panel.first=grid())

La documentation plot.default () donne plus d'informations sur ces paramètres.

Lorsque vous utilisez un intervalle de ticks personnalisé, le plus simple est de dessiner la grille à l'aide d'une abline:

plot(x = 1:10, y = rnorm(10, 5, 2), xaxp=c(1, 10, 10), yaxp=c(1, 10, 10), axes=FALSE)
axis(1, 1:10)
axis(2, 1:10)
abline(h=1:10, v=1:10, col="gray", lty=3)

grid example

Plus d'informations sur les intervalles de ticks personnalisés dans ce fil et ici pour l'alignement de la grille.

20
Robert Kubrick

Pour la postérité, voici la manière longue de le faire manuellement:

plot (x = 1:10, y = rnorm (10, 5, 2))
grid (lty = 6, col = "cornsilk2")

xaxp <- par("xaxp")
yaxp <- par("yaxp")

abline(v=seq(xaxp[1], xaxp[2], (xaxp[2]-xaxp[1])/xaxp[3]), lty=6, col = "cornsilk2")
abline(h=seq(yaxp[1], yaxp[2], (yaxp[2]-yaxp[1])/yaxp[3]), lty=6, col = "cornsilk2")
5
Andrie

La réponse fournie ici est beaucoup plus simple, bien que vous n'aimiez peut-être pas le manque "d'espace libre" à chaque extrémité des axes. En bref,

Le problème est que la grille place nx lignes de grille dans l'espace utilisateur, mais plot ajoute 4% d'espace supplémentaire de chaque côté. Vous pouvez en prendre le contrôle. Ajouter xaxs="i", yaxs="i" à votre tracé désactivera l'espace supplémentaire. Mais alors votre point supérieur droit sera coupé, vous devez donc changer les valeurs xlim et ylim et changer nx pour correspondre

1
Carl Witthoft