¿Cómo arreglar la relación de aspecto en ggplot?

88

Estoy tratando de cambiar el tamaño de un gráfico para que quepa en mi documento, pero tengo dificultades para que el diagrama trazado sea un cuadrado.

Ejemplo:

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

Aunque los límites para xey son los mismos, la gráfica del resultado no es cuadrada. Supongo que R hace que el panel envolvente sea de 5x5 "pero no le importa el tamaño real del diagrama.

¿Cómo puedo deshacer mis diagramas?

htorque
fuente

Respuestas:

113

En ggplotel mecanismo para preservar la relación de aspecto de su trama es agregar una coord_fixed()capa a la trama. Esto conservará la relación de aspecto del gráfico en sí, independientemente de la forma del cuadro delimitador real.

(También le sugiero que use ggsavepara guardar su trama resultante en pdf / png / etc, en lugar de la pdf(); print(p); dev.off()secuencia).

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()

ingrese la descripción de la imagen aquí

Andrie
fuente
3
¿Sabes por qué ggplot insiste en colocar la etiqueta del eje y hacia la izquierda? Me encantaría saber cómo prevenir eso ...
Chase
@chase Una solución alternativa es modificar la hjustposición del título, inténtalo opts(axis.title.y=theme_text(hjust=10)). Pero, lamentablemente, parece que no. Consulte groups.google.com/group/ggplot2/browse_thread/thread/… para ver una discusión sobre la lista de correo de ggplot y la respuesta de @ Baptiste.
Andrie
3
Ese comportamiento está arreglado en la versión de desarrollo.
hadley
5
Con el título más general de la pregunta, ¿podría agregar información sobre cómo calcular la proporción (el argumento de coord_fixed) dado que uno no usa los mismos límites en ambos ejes?
htorque
1
Además del comentario de @ htorque; si y en cambio se define como, y=runif(100, 0, 50)entonces el aspecto del gráfico ya no es cuadrado. coord_fixed()hace que la escala de cada eje sea igual solo que parece?
un ben diferente
79

Para garantizar una relación de aspecto particular, por ejemplo, para cuadrado, utilice theme(aspect.ratio=1).

La respuesta de Andrie no ofrece una imagen completa, ya que el ejemplo proporciona datos quizás no naturales donde el rango de x es igual al rango de y. Sin embargo, si los datos fueran:

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

entonces la trama se vería así:

ingrese la descripción de la imagen aquí

La función coord_fixed () también tiene un argumento para ajustar la relación de ejes:

ratio relación de aspecto, expresada como y / x

Para que la trama pueda cuadrar con:

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

ingrese la descripción de la imagen aquí

Pero necesita ajustar esto con los límites de las variables o el área de la gráfica (no todos los límites son divisibles por números enteros como estos ejemplos).

un ben diferente
fuente
12

En aras de la integridad: si desea tener en cuenta límites de eje muy diferentes:

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)

Resultando en:

Graipher
fuente
14
¿cómo es eso mejor que plot + theme(aspect.ratio=4/3)? El ggplot puede tener múltiples capas, con múltiples conjuntos de datos, y los ejes pueden tener factores de expansión arbitrarios, por lo que calcular la relación de y / x de una fuente de datos parece bastante frágil.
baptiste
2
Porque aparentemente esto no es fácil de descubrir. Lo cual se prueba por el hecho de que hay tres respuestas aquí, pero ninguna la menciona. Debería ponerlo en una respuesta, definitivamente es la mejor solución.
Graipher