2015-11-29 14 views
9

Ho un grafico ggplot2 che appare come segue:griglia Overlay anziché disegnare su di esso

ggplot2 graph without axis lines visible

noti che le linee della griglia o assi non mostrano attraverso i nastri. Un modo per risolvere questo problema è modificare la proprietà alpha dei nastri; tuttavia, questo può rendere i colori più chiari troppo leggeri.

Un'idea alternativa sarebbe quella di disegnare le linee di griglia/asse sopra i nastri anziché sotto di essi. Come posso ottenere questo ordine di rendering?

Ovviamente, è possibile chiedere la domanda di qualsiasi trama generata da ggplot2. Ma un comando di copia-e-incolla che illustra la questione è la seguente:

ggplot(data.frame(x=sample(1:100),y=sample(1:100)),aes(x=x,y=y))+geom_point(size=20) 
+1

È più probabile che saremo in grado di aiutarti se fai un esempio riproducibile minimo per andare avanti con la tua domanda. Qualcosa da cui possiamo lavorare e utilizzarlo per mostrarti come potrebbe essere possibile risolvere il tuo problema. Puoi dare un'occhiata a [questo post SO] (https://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example) su come realizzare un ottimo esempio riproducibile in R –

+0

@EricFail: poiché questo si applicherebbe generalmente a qualsiasi immagine fatta con ggplot, un MWE non sembrava necessario; tuttavia, ho aggiunto un WE che genera un caso di test adatto. – Richard

+0

http://stackoverflow.com/questions/19054092/r-put-ggplot-grid-lines-in-foreground. A meno che non ci sia stato un nuovo sviluppo, sembra che le geografie extra h/vline siano la strada da percorrere – user20650

risposta

2

ggplot introdotto un'opzione in theme() che ti permette di fare proprio questo con pull number 993, il 18 giugno, 2015.

è sufficiente aggiungere al vostro diagramma:

+ theme(
    panel.background = element_rect(fill = NA), 
    panel.ontop = TRUE 
) 

C'è un esempio nel ggplotdocs .

4

Ecco una soluzione utilizzando geom_hline e geom_vline.

f <- ggplot(mpg, aes(cty, hwy)) 
f + geom_smooth(color="red") 

Genera questa trama.

enter image description here

Per inserirlo linee orizzontali e verticali manualmente:

f + geom_smooth(color="red") 
    + geom_vline(xintercept = c(10,15,20,25,30,35), color="white", size=1.25) 
    + geom_hline(yintercept = c(20,30,40), color="white", size=1.25) 

Per aggiungere automaticamente xintercept e yintercept:

f <- ggplot(mpg, aes(cty, hwy)) + geom_smooth(color="red") 
x_intercept <- ggplot_build(f)$panel$ranges[[1]]$x.major_source 
## x_intercept 
## [1] 10 15 20 25 30 35 
y_intercept <- ggplot_build(f)$panel$ranges[[1]]$y.major_source 
## y_intercept 
## [1] 20 30 40 
f + geom_vline(xintercept=x_intercept, color="white", size=1.25) 
    + geom_hline(yintercept=y_intercept, color="white", size=1.25) 

Ora eventuali modifiche di axis-ticks introdotte dal scale-* funzioni rifletterà in la trama finale.
Qui abbiamo linee orizzontali e verticali (simili alla griglia) in cima alla trama. È possibile variare size per rendere le linee più spesse. enter image description here

Ma è solo una soluzione. Data la flessibilità del pacchetto ggplot2, I penso a qualcosa di simile può essere ottenuto utilizzando theme. Ma non so come.

Edit1: Possiamo provare a seguire ma non inserirà le griglie in cima. In questo modo possiamo cambiare size, color, linetype ma questo è tutto.

f + geom_smooth(color="red") 
    + theme(panel.grid.major=element_line(color="white", size=2)) 

Edit2: aggiunte automaticamente inserimento di xintercept e yintercept usando ggplot_build(f) come spiegato here.

+0

Grazie, questo ha aiutato molto! Ma sembra che in questi giorni devi usare 'ggplot_build (f) $ layout $ panel_ranges [[1]] $ x.major_source' – nadieh

+0

@nadieh non hai bisogno di questo, vedi la mia risposta – AF7

6

È possibile utilizzare la funzionalità del pacchetto grid per estrarre le linee della griglia dal grafico e quindi ridisegnarle, il che eviterebbe alcune specifiche manuali quando si aggiungono linee orizzontali o verticali.

library(ggplot2) 
library(grid) 

# Draw your plot 
ggplot(data.frame(x=sample(1:100),y=sample(1:100)), aes(x=x,y=y))+ 
    geom_point(size=20) 

# This extracts the panel including major and minor gridlines 
lines <- grid.get("grill.gTree", grep=TRUE) 

# Redraw plot without the gridlines 
# This is done, as otherwise when the lines are added again they look thicker 
last_plot() + 
    theme(panel.grid.minor = element_blank(), 
     panel.grid.major = element_blank()) 

# Navigate to relevant viewport 
# To see these use grid.ls(viewports=TRUE) 
seekViewport("panel.3-4-3-4") 

# Redraw lines 
grid.draw(lines$children[-1]) 

che produce

enter image description here

In alternativa, se si voleva automatizzare l'aggiunta delle linee verticali e orizzontali all'interno ggplot (come nella risposta di Narendra), ma senza specificare le pause manualmente, può accedere alle loro posizioni usando ggplot_build(p), dove p è la trama.


Può valere la pena mostrarlo per un grafico con faccette. Stessa procedura, tranne quando selezioni più linee e pannelli, quindi esegui semplicemente il ciclo per disegnare.

# New plot with facets 
ggplot(mtcars, aes(mpg, wt)) + geom_point(size=10) + facet_grid(am~cyl) 

gr <- grid.ls(print=FALSE) 
# Get the gTree for each of the panels, as before  
lines <- lapply(gr$name[grep("grill.gTree", gr$name)], grid.get) 

last_plot() + 
    theme(panel.grid.minor = element_blank(), 
     panel.grid.major = element_blank()) 

# Get the names from each of the panels 
panels <- gr$name[grep("panel.\\d", gr$name)] 

# Loop through the panels redrawing the gridlines 
for(i in 1:length(panels)) { 
      seekViewport(panels[i]) 
      grid.draw(lines[[i]]$children[-1]) 
      } 

Questo funzionerà anche per le trame senza fatti.

Problemi correlati