web-dev-qa-db-fra.com

Forcer le diagramme de dispersion ggplot2 à être de forme carrée

Je peux forcer le nuage de points ggplot2 à être de forme carrée avec la même échelle x et y en utilisant xlim() et ylim(), mais il a besoin d'un calcul manuel des limites. Existe-t-il un moyen plus pratique de le faire?

Par forme carrée, j'entends deux exigences:

  1. La même échelle sur les axes x et y.
  2. La longueur égale des axes x et y.
40
Ali

Si vous souhaitez rendre les points d'échelle de distance identiques, utilisez alors coord_fixed () :

p <- ggplot(...)
p <- p + coord_fixed() # ratio parameter defaults to 1 i.e. y / x = 1

Si vous voulez vous assurer que le tracé résultant est carré, vous devez également spécifier que les limites x et y doivent être les mêmes (ou au moins avoir la même plage). xlim et ylim sont tous deux des arguments pour coord_fixed. Vous pouvez donc le faire manuellement en utilisant ces arguments. Ou vous pouvez utiliser une fonction pour extraire les limites des données.

50
mys

Remarque: pour une forme carrée (quelles que soient les données tracées),

ggplot() + theme(aspect.ratio=1)

enter image description here

35
baptiste

Probablement le code le plus laid que vous verrez aujourd'hui, mais il fait l'affaire.

Les plages de vos axes x et y sont accessibles depuis ggplot_build:

r<-max(abs(ggplot_build(your_plot)$panel$ranges[[1]]$x.range))
s<-max(abs(ggplot_build(your_plot)$panel$ranges[[1]]$y.range))
t<-round(max(r,s),1)
your_plot<-your_plot+coord_equal(xlim=c(-t,t),ylim=c(-t,t))
6
Ramon

S'appuyant sur la réponse de Ramons, cette fonction fonctionne bien pour moi et je la considère pas aussi moche, car on peut masquer la définition de la fonction ...

squarePlot <- function(plt){
    return(plt+coord_equal()+
            expand_limits(x=ggplot_build(plt)$panel$ranges[[1]]$y.range,
                          y=ggplot_build(plt)$panel$ranges[[1]]$x.range))
}

juste encapsuler le code de Ramon dans une fonction n'a pas fonctionné pour moi car la variable t est définie dans le "mauvais" environnement.

1
Sven Stodtmann