web-dev-qa-db-fra.com

Comment corriger le rapport de format dans ggplot?

J'essaie de redimensionner un tracé pour qu'il corresponde à mon document, mais j'ai du mal à faire en sorte que le diagramme tracé soit un carré.

Exemple:

pdf(file = "./out.pdf", width = 5, height = 5)
p <- ggplot(mydata, aes(x = col1, y = col2))
print(p)
aux <- dev.off()

Bien que les limites pour x et y soient identiques, le tracé du résultat n'est pas carré. Je suppose que R fait le panneau englobant 5x5 "mais ne se soucie pas de la taille réelle du diagramme.

Comment puis-je nsquash mes diagrammes?

69
htorque

Dans ggplot, le mécanisme permettant de conserver les proportions de votre tracé consiste à ajouter un calque coord_fixed() au tracé. Cela préservera les proportions du tracé lui-même, quelle que soit la forme du cadre de sélection.

(Je vous suggère également d'utiliser ggsave pour enregistrer votre tracé obtenu au format pdf/png/etc, plutôt que la séquence pdf(); print(p); dev.off().)

library(ggplot2)
df <- data.frame(
    x = runif(100, 0, 5),
    y = runif(100, 0, 5))

ggplot(df, aes(x=x, y=y)) + geom_point() + coord_fixed()

enter image description here

95
Andrie

Pour garantir un rapport de forme particulier, par exemple pour square, utilisez theme(aspect.ratio=1).

La réponse d'Andrie ne donne pas une image complète, car l'exemple fournit peut-être des données non naturelles dans lesquelles la plage de x est égale à la plage de y. Si toutefois les données étaient:

df <- data.frame(
  x = runif(100, 0, 50),
  y = runif(100, 0, 5))
ggplot(df, aes(x=x, y=y)) + geom_point() + coord_fixed()

alors l'intrigue ressemblerait à ceci:

enter image description here

La fonction coord_fixed () a aussi un argument pour ajuster le ratio d'axes:

ratio rapport d'aspect, exprimé par y/x

Pour que l'intrigue puisse être faite en carré avec:

ggplot(df, aes(x=x, y=y)) + geom_point() + coord_fixed(ratio=10)

enter image description here

Mais vous devez ajuster ceci avec les limites des variables ou de la zone de tracé (toutes les limites ne sont pas bien divisibles par des nombres entiers comme dans ces exemples).

63
a different ben

Par souci d’exhaustivité: Si vous souhaitez prendre en compte des limites d’axe très différentes:

df <- data.frame(
  x = runif(100, 0, 5000),
  y = runif(100, 0, 5))
ratio.display <- 4/3
ratio.values <- (max(df$x)-min(df$x))/(max(df$y)-min(df$y))
plot <- ggplot(df, aes(x=x, y=y)) + geom_point()
plot + coord_fixed(ratio.values / ratio.display)

Résultant en:

9
Graipher