2015-07-13 20 views
11

In R Trovo sempre fastidioso che i grafici di base R, lattice e ggplot2 funzionino tutti con dimensioni dei punti assolute per la dimensione dei simboli di testo e di trama.R: funzione per ridimensionare graficamente ggplot2, retice o R grafico

Questo significa che se si aumenta dire che la dimensione della finestra del complotto per ottenere un grafico pagina di riempimento da

windows(width=5,height=5);qplot(Sepal.Length, Petal.Length, data = iris, color = Species, size = Petal.Width, alpha = I(0.7)) 

a

windows(width=10,height=10);qplot(Sepal.Length, Petal.Length, data = iris, color = Species, size = Petal.Width, alpha = I(0.7)) 

che la relativa scala dei simboli di testo e trama cambia relativo il resto. Lo stesso vale per i grafici di base R e lattice.

Nel contesto di alcune funzioni di esportazione di grafici che sto scrivendo mi chiedevo se sarebbe stato possibile scrivere una funzione che avrebbe preso l'output del dispositivo grafico corrente (a cui è possibile accedere usando recordPlot()) e ridimensionare tutto il grafico simboli e testo e larghezza delle righe di una percentuale arbitraria, consentendo così di esportare il grafico a qualsiasi dimensione, mantenendo sempre lo stesso aspetto? Cioè una funzione per ridimensionare proporzionalmente l'intero grafico ad una dimensione più grande o più piccola mantenendo l'aspetto lo stesso?

PS the same would be required to be able to scale the RStudio plot window on high DPI 4K screens and still make it legible (right now RStudio uses pixel doubling but this makes the plot window look really fuzzy, and also causes problems in combination with Cleartype on Windows, causing colour fringing).

risposta

5

per qualche ragione la dimensione del punto è codificato come fontsize, quindi non sembra facile per convertirlo in unità che scala automaticamente. Se si sa che cosa il ridimensionamento che ci si vuole applicare, allora quanto segue potrebbe aiutare

library(ggplot2) 
p <- qplot(Sepal.Length, Petal.Length, data = iris, 
      geom=c("point","line"), 
      color = Species, size = Petal.Width, alpha = I(0.7)) 

library(gtable) 
library(grid) 

g <- ggplotGrob(p) 
pts <- g$grobs[[4]][["children"]][[2]] # geom_point layer 
lns <- g$grobs[[4]][["children"]][[3]] # geom_line layer 
g$grobs[[4]][["children"]][[2]] <- editGrob(pts, size=1.2*pts$size) 
gp <- modifyList(lns$gp, list(lwd=1.2*lns$gp$lwd)) 
g$grobs[[4]][["children"]][[3]] <- editGrob(lns, gp=gp) 

grid.newpage() 
grid.draw(g) 

enter image description here

+0

Thx per questo - quando ho prova il codice g e p sembrano uguali però. qualche idea? Inoltre, quello che sto cercando è un modo generico per ridimensionare tutti gli elementi grafici, comprese le larghezze delle linee, i simboli di tracciamento e le dimensioni dei caratteri di qualche fattore. In questo modo se, ad es. ridimensionare la finestra della trama di un fattore 2 è possibile ridimensionare tutti gli elementi grafici con lo stesso fattore ... Ciò dovrebbe idealmente funzionare per ggplot2 e per i grafici a traliccio o base R ... –

+0

sto usando la versione dev di ggplot2, è abbastanza probabile che le versioni precedenti usassero la dimensione invece di fontsize (penso che sia una mossa recente) – baptiste

+0

Ha OK proverò con la versione di sviluppo di ggplot2 quindi - anche se questa sarebbe solo una soluzione parziale di ggplot2 allora immagino, e sto cercando una soluzione che funzionerebbe eg con grafici a traliccio. Come soluzione alternativa, non è possibile cambiare il ppi della finestra grafica (penso che ora sia 72)? Per esempio. acquisire il grafico con recordPlot(), cambiare ppi per cambiare il ridimensionamento e quindi ridisegnare? –

4

Questo sembra essere più vicino al tuo obiettivo finale

library(ggplot2) 
p <- qplot(Sepal.Length, Petal.Length, data = iris, 
      geom=c("point","line"), 
      color = Species, size = Petal.Width, alpha = I(0.7)) 
library(grid) 
print(p, vp=viewport(gp=gpar(cex=2, lex=2))) 
+0

Grazie anche per questa soluzione - +1 - anche se probabilmente anche non abbastanza vicino al risultato desiderato per essere davvero utilizzabile - ad es. finestre (altezza = 5, larghezza = 5); p e windows (altezza = 10, larghezza = 10); print (p, vp = viewport (gp = gpar (cex = 2, lex = 2))) produce risultati abbastanza diversi, ad es. la dimensione dei simboli di trama e la spaziatura nella legenda non si ridimensionano lungo ... Abbastanza complicato ... Sembra essere il tipo di cosa che dovrebbe essere supportata ad un livello basso in grDevices Immagino ... Forse con qualche impostazione dpi questo direbbe quanti dpi lo schermo è ... –

Problemi correlati