2010-09-25 140 views
12

He buscado esto y he encontrado que con {grid} hay formas de rotar una imagen, y que para algunos gráficos puedes jugar con su rotación (por ejemplo, plot (x, y) en lugar de plot (y, x)) .¿Es posible rotar un gráfico en R (gráficos base)?

Sin embargo, quiero saber si hay un método genérico para rotar un diagrama en R (uno que funcionaría para CUALQUIER diagrama generado en gráficos base)?

+2

¿Está hablando de "rotar los datos" (como su ejemplo implicaría) o de "girar el gráfico" (es decir girándolo gráficamente 35 grados a la derecha) – nico

+0

nico - B. Gracias :) –

+0

Entonces Me información útil aquí https://stat.ethz.ch/pipermail/r-help/2003-May/033157.html –

Respuesta

5

Estoy razonablemente seguro de que no hay forma de que los gráficos base lo hagan genéricamente. Sin embargo, existe el paquete gridBase que permite mezclar gráficos base y gráficos de cuadrícula en un 'gráfico'. La viñeta del paquete tiene una sección sobre la incrustación de gráficos base en la cuadrícula viewports, por lo que puede ver allí para ver si puede cocinar una envoltura de cuadrícula alrededor de sus parcelas y usar la cuadrícula para hacer la rotación. No estoy seguro de si esta es una ruta viable pero, hasta donde sé, la única ruta potencial a una respuesta a su Q.

gridBase está en CRAN y el autor es Paul Murrell, el autor del paquete de cuadrícula .

Después de navegar por la viñeta, observo una de las balas en los problemas y en la sección Limitaciones en la página, lo que indica que es no posible incrustar gráficos de base en un girargrid ventana gráfica. Así que supongo que no tienes suerte.

+0

¡Buena respuesta! (aunque no el que me hubiera gustado leer) ¡Gracias! –

2

Dado que es posible escribir sus propias funciones de trazado utilizando gráficos básicos, no veo cómo podría existir una única solución. ¿Es lo que realmente quiere una forma de representar x datos con datos? ¿A qué te refieres con "rotar"?

+0

rotar = para hacer que el diagrama de salida sea (por ejemplo) girado 90 grados. –

+0

¿Te refieres a la trama * whole *? Ejes, texto, marcas, etc, etc. Eso parece inútil en un dispositivo de gráficos de pantalla, o en un dispositivo de posdatas, probablemente pueda usar horizontal = TRUE/FALSE para producir un diagrama girado relativo al papel. O use el dispositivo de gráficos svg() y luego cargue el archivo svg en inkscape, seleccione todo y gire 90 grados. Esas son todas formas válidas de hacer que la trama de salida tenga 90 grados de rotación. – Spacedman

+0

Eso es cierto, pero me preguntaba si hay una manera de hacerlo en R :) –

2

Una función rotate_plot para ser utilizado como

rotate_plot(some_base_plot(x, y, ...)) 

no es posible porque la mayor parte de la trama de base no devolver un valor.

Algunos de los trazados contienen un argumento horiz que le permite elegir en qué dirección desea el trazado del trazado. Eche un vistazo al barplot.default para ver cómo implementar esto. (Advertencia: es complicado.)

@ sugerencia de ucfagls para usar gridBase es su mejor opción. Hay algunos ejemplos de su uso en Appendix B de Murrell's R Graphics.

+0

Gracias Richie - Estoy triste por la respuesta, pero es una respuesta no obstante. Marcaré como respuesta "ucfagls" de respuesta "para el tiempo. Best, Tal –

4

Spinning Diagramas de dispersión 3D

También puede crear un diagrama de dispersión 3D interactivo utilizando la (y, x, z) la función en el paquete RGL plot3d. Crea un diagrama de dispersión en 3D giratorio que se puede girar con el mouse. Los tres primeros argumentos son los vectores numéricos x, y y z que representan puntos. col = y size = controlan el color y el tamaño de los puntos, respectivamente.

# Spinning 3d Scatterplot 
library(rgl) 

plot3d(wt, disp, mpg, col="red", size=3) 
7

puede exportar el gráfico, leerlo de nuevo, y lo mostrará girar como un rasterGrob, por ejemplo, (o una rasterImage después de rotar la matriz, o una grImport Grob si quieres trazados vectoriales)

plot(1:10, rnorm(10)) 
library(grid) 
cap <- grid.cap() 
grid.newpage() 
grid.raster(cap, vp=viewport(angle=30)) 

El nuevo paquete gridGraphics ahora puede ser una mejor alternativa.

Nota: esto no parece funcionar con el dispositivo gráfico de Rstudio, presumiblemente no han implementado grid.cap.

enter image description here

+3

¡Tu código no funciona! 'Error en UseMethod (" as.raster "): no aplica el método para 'as.raster' aplicado a un objeto de clase" NULL "' –

+1

obtengo un error similar :( – user2543622

4

Es una especie de posible a través del paquete de gridGraphics, aunque se siente un poco áspero en los bordes (los ejemplos de ?grid.echo No todo el trabajo para mí),

plot(1:10, rnorm(10)) 

library(gridGraphics) 

grab_grob <- function(){ 
    grid.echo() 
    grid.grab() 
} 

g <- grab_grob() 
grid.newpage() 
pushViewport(viewport(width=0.7,angle=30)) 
grid.draw(g) 

enter image description here

Cuestiones relacionadas