2010-09-25 7 views
12

Ho cercato questo e ho scoperto che con {grid} ci sono modi per ruotare un'immagine, e che per alcuni grafici puoi giocare con la loro rotazione (per esempio trama (x, y) invece di trama (y, x)) .È possibile ruotare un grafico in R (grafica di base)?

Tuttavia, desidero sapere se è disponibile il metodo per ruotare un grafico in R (uno che potrebbe funzionare per QUALSIASI grafico generato nella grafica di base)?

+2

Stai parlando di "rotazione dei dati" (come il tuo esempio implicherebbe) o di "rotazione del grafico" (cioè ruotandolo graficamente di 35 gradi a destra) – nico

+0

nico - B. Grazie :) –

+0

Quindi mi informazioni utili qui https://stat.ethz.ch/pipermail/r-help/2003-May/033157.html –

risposta

5

Sono ragionevolmente certo che non ci sia un modo con la grafica di base stessa per farlo genericamente. Esiste tuttavia il pacchetto gridBase che consente di mixare grafica di base e grafica della griglia in una "trama". La vignetta per il pacchetto ha una sezione sull'incorporare la grafica di base nella griglia viewports, quindi potresti guardare lì per vedere se puoi cucinare un involucro griglia attorno ai tuoi grafici e usare la griglia per fare la rotazione. Non sono sicuro se questa sia una strada percorribile ma è, per quanto ne so, l'unica via potenziale per una risposta alla tua Q.

gridBase è su CRAN e l'autore è Paul Murrell, l'autore del pacchetto di rete .

Dopo la navigazione in vignetta, rilevo uno dei proiettili nei problemi e la sezione Limitazioni sulla pagina, che afferma che è non possibile incorporare la grafica di base in un ruotatogrid viewport. Quindi immagino che tu non abbia fortuna.

+0

Buona risposta! (anche se non quello che mi piaceva leggere) Grazie! –

2

Dato che è possibile scrivere le proprie funzioni di stampa utilizzando la grafica di base, non riesco a vedere come potrebbe esistere un'unica soluzione. È quello che vuoi davvero solo un modo di ripubblicare x dati con dati y? Cosa intendi per "rotazione"?

+0

ruotare = per rendere il grafico di output (ad esempio) ruotato di 90 gradi. –

+0

Intendi la trama * intera *? Assi, testo, segni di spunta ecc. Ecc.? Ciò sembra inutile su un dispositivo di grafica dello schermo o su un dispositivo PostScript, è possibile utilizzare probabilmente orizzontale = TRUE/FALSE per produrre un grafico ruotato rispetto alla carta. Oppure usa il dispositivo grafico svg() e carica il file svg in inkscape, seleziona tutto e ruota di 90 gradi. Questi sono tutti modi validi per far ruotare il grafico di output di 90 gradi. – Spacedman

+0

Questo è vero, ma mi stavo chiedendo se c'è un modo per farlo in R :) –

2

Una funzione rotate_plot da utilizzare come

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

non è possibile perché la maggior parte della trama di base non restituiscono un valore.

Alcuni dei grafici contengono un argomento horiz per consentire all'utente di scegliere in quale direzione si desidera disegnare. Dai uno sguardo allo barplot.default per vedere come implementarlo. (Attenzione: è disordinato.)

Il suggerimento di ucfagls di utilizzare gridBase è la soluzione migliore. Ci sono alcuni esempi del suo utilizzo in Appendix B di Murrell's R Graphics.

+0

Grazie a te Richie - Sono triste per la risposta, ma è una risposta non di meno. Contrassegnerò come risposta la risposta di ucfagls per i tempi. Best, Tal –

4

filatura a dispersione 3D

È inoltre possibile creare un grafico a dispersione 3D interattiva utilizzando il (x, y, z) funzione nel pacchetto rgl tracciare3d. Crea uno scatterplot 3D rotante che può essere ruotato con il mouse. I primi tre argomenti sono i vettori numerici x, yez che rappresentano i punti. col = e size = controllano rispettivamente il colore e la dimensione dei punti.

# Spinning 3d Scatterplot 
library(rgl) 

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

si potrebbe esportare l'immagine, leggere di nuovo in, e visualizzarlo ruotato come rasterGrob, per esempio, (o un rasterImage dopo aver ruotato la matrice, o un Grob grImport se si vuole tracciati vettoriali)

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

Il nuovo pacchetto gridGraphics potrebbe essere un'alternativa migliore.

Nota: questo non sembra funzionare con il dispositivo grafico di Rstudio, presumibilmente non hanno implementato grid.cap.

enter image description here

+3

Il tuo codice non funziona! 'Errore in UseMethod (" as.raster "): nessun metodo applicabile per 'as.raster' applicato a un oggetto di classe" NULL "' –

+1

mi sto verificando un errore simile :( – user2543622

4

È una specie di possibile tramite il pacchetto gridGraphics, anche se ci si sente un po 'ruvido sui bordi (gli esempi in ?grid.echo Non tutto il lavoro per me),

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