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:
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.
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))
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.