2015-07-06 14 views
8

Sto provando a generare alcuni frattali e ho una domanda riguardante i margini con ggplot in R. Sto usando il seguente codice per generare i frattali.Quando si utilizza ggplot in R, come si rimuovono i margini che circondano l'area di stampa?

library(ggplot2) 
library(grid) 

max_iter=25 
cl=colours() 
step=seq(-2,0.8,by=0.005) 
points=array(0,dim=c(length(step)^2,3)) 
t=0 

for(a in step) { 
    for(b in step+0.6) { 
    x=0;y=0;n=0;dist=0 
    while(n<max_iter & dist<4) { 
     n=n+1 
     newx=a+x^2-y^2 
     newy=b+2*x*y 
     dist=newx^2+newy^2 
     x=newx;y=newy 
    } 

    if(dist<4) { 
     color=24 # black 
    } else { 
     color=n*floor(length(cl)/max_iter) 
    } 
    t=t+1 
    points[t,]=c(a,b,color) 
    } 
} 

df=as.data.frame(points)  

ggplot(data=df, aes(V1, V2, color=cl[V3]))+ 
    geom_point() + 
    theme(panel.background=element_blank(), 
     panel.grid.major=element_blank(), 
     panel.grid.minor=element_blank(), 
     panel.margin = unit(c(0, 0, 0, 0), "cm"),  
     axis.ticks=element_blank(), 
     axis.text.x=element_blank(), 
     axis.text.y=element_blank(), 
     axis.title.x=element_blank(), 
     axis.title.y=element_blank(), 
     plot.background = element_rect(fill = "transparent",colour = NA), 
     plot.margin = unit(c(0, 0, 0, 0), "cm"), 
     legend.position = 'none') 

last_plot() + scale_colour_manual(values=sort(c("#00000000", rainbow(35)), decreasing=FALSE)) 

ggsave('mandelbrot.png'); 
print('Image Saved.') 

Sto cercando idee per rimuovere i margini che circondano l'area del tracciato. Ho provato un sacco di trucchi, come l'impostazione dei parametri nel 'par', xaxes/yaxes, last_plot() + labs (x = NULL, y = NULL), ecc, ma nulla sembra funzionare.

Qualcuno ha un'idea per rimuovere questo margine intrattabile dalla trama? Ho anche pensato di impostare uno sfondo trasparente, ma avrei dovuto tagliare i margini, un passo che vorrei evitare.

enter image description here

+2

provare a utilizzare 'null' come unità, vale a dire' plot.margin = unità (c (0, 0, 0, 0), " null ")' – hrbrmstr

risposta

7

Un approccio che seleziona solo il pannello plot dal layout ggplot. Crea il ggplot, impostando gli elementi all'interno del pannello di stampa su element_blank e senza espansione delle scale xey. Quindi crea il ggplot grob in modo che solo il pannello trama possa essere selezionato dal layout.

Modifica minima: Aggiornamento a ggplot2 2.2.0

library(ggplot2) 
library(grid) 

max_iter=25 
cl=colours() 
step=seq(-2,0.8,by=0.005) 
points=array(0,dim=c(length(step)^2,3)) 
t=0 

for(a in step) { 
    for(b in step+0.6) { 
    x=0;y=0;n=0;dist=0 
    while(n<max_iter & dist<4) { 
     n=n+1 
     newx=a+x^2-y^2 
     newy=b+2*x*y 
     dist=newx^2+newy^2 
     x=newx;y=newy 
    } 

    if(dist<4) { 
     color=24 # black 
    } else { 
     color=n*floor(length(cl)/max_iter) 
    } 
    t=t+1 
    points[t,]=c(a,b,color) 
    } 
} 

df=as.data.frame(points)  

# ggplot with elements in the plot panel set to element_blank() 
# and no expansion on the scales 
p = ggplot(data=df, aes(V1, V2, color=cl[V3]))+ 
    geom_point() + 
    scale_x_continuous(expand = c(0,0), limits=range(df$V1)) + 
    scale_y_continuous(expand = c(0,0), limits=range(df$V2))+ 
    theme(panel.grid=element_blank(), 
     panel.background=element_rect(fill = "transparent",colour = NA), 
     panel.border=element_blank()) + 
    scale_colour_manual(values=sort(c("#00000000", rainbow(35)), decreasing=FALSE)) 

# Get the ggplot grob 
gt = ggplotGrob(p) 

# Select plot panel only 
# gt = gt[6,4] # Using index notation; OR 
gt = gtable::gtable_filter(gt, "panel") 

# Draw it 
grid.newpage() 
grid.draw(gt) 


# Set up a print method 
class(gt) = c("Panel", class(gt)) 
print.Panel <- function(x) { 
    grid.newpage() 
    grid.draw(x) 
} 

gt 
ggsave('mandelbrot.png', gt) 
+0

'gtable_filter (gt," panel ")' potrebbe essere più leggibile per selezionare il pannello – baptiste

7

Dopo aver utilizzato il codice, vedo più chiaramente ciò che stai cercando. Questo:

gg <- ggplot(data=df, aes(V1, V2, color=cl[V3])) 
gg <- gg + geom_point() 
gg <- gg + labs(x=NULL, y=NULL, title=NULL) 
gg <- gg + scale_x_continuous(expand=c(0,0), limits=range(df$V1)) 
gg <- gg + scale_y_continuous(expand=c(0,0), limits=range(df$V2)) 
gg <- gg + scale_colour_manual(values=sort(c("#00000000", rainbow(35)), decreasing=FALSE)) 
gg <- gg + theme(panel.background=element_rect(fill = "transparent",colour = NA)) 
gg <- gg + theme(plot.background=element_rect(fill = "transparent",colour = NA)) 
gg <- gg + theme(panel.grid=element_blank()) 
gg <- gg + theme(panel.border=element_blank()) 
gg <- gg + theme(plot.margin=unit(c(0,0,0,0), "null")) 
gg <- gg + theme(panel.margin=unit(c(0,0,0,0), "null")) 
gg <- gg + theme(axis.ticks=element_blank()) 
gg <- gg + theme(axis.text=element_blank()) 
gg <- gg + theme(axis.title=element_blank()) 
gg <- gg + theme(axis.line=element_blank()) 
gg <- gg + theme(legend.position="none") 
gg <- gg + theme(axis.ticks.length=unit(0, "null")) 
gg <- gg + theme(axis.ticks.margin=unit(0, "null")) 
gg <- gg + theme(legend.margin=unit(0, "null")) 
gg 

è necessario rimuovere le etichette, non-espandere l'asse y x & e impostare limiti rigidi. Anche gli null s sono importanti. "

Questo può essere fatto anche facendo gb <- ggplotGrob(gg) e modificando manualmente i parametri di groove &, ma penso che questo probabilmente ti porti ciò di cui hai bisogno.

+0

Oppure, invece di tutte queste dichiarazioni di temi, usa 'theme_nothing()' dal pacchetto cowplot. È fondamentalmente la stessa cosa, però. –

+0

Insegnare a pescare ... e penso che il lavoro "" nullo "funzioni meglio di" linee "' se la memoria serve per eliminare completamente la spaziatura, che può essere validata a livello di grob se è così (posso verificare in seguito) . – hrbrmstr

+0

Vorrei assolutamente sapere se 'null' è una scelta migliore di' lines' in questa applicazione, quindi per favore fatemi sapere cosa trovate.A priori, sembra che "null" generi un sovraccarico non necessario, poiché è un'unità relativa che può crescere e restringersi a seconda delle dimensioni degli altri elementi nella trama. –

2

Sono stato in grado di eliminare il bordo bianco impostando margini negativi di stampa e impostando i titoli degli assi su NULL. Ho segnato le modifiche nel codice qui sotto.

p = ggplot(data=df, aes(V1, V2, color=cl[V3]))+ 
    geom_point() + 
    theme(panel.background=element_blank(), 
     panel.grid.major=element_blank(), 
     panel.grid.minor=element_blank(), 
     panel.margin = unit(c(0, 0, 0, 0), "cm"),  
     axis.ticks=element_blank(), 
     axis.text.x=element_blank(), 
     axis.text.y=element_blank(), 
     axis.title.x=element_blank(), 
     axis.title.y=element_blank(), 
     plot.background = element_rect(fill = "transparent",colour = NA), 
     plot.margin = unit(c(-1, -1.2, -1.2, -1.5), "cm"), # Edited code 
     legend.position = 'none') + 
    labs(x=NULL, y=NULL) # New code 
+0

sono quelle voci 'plot.margin' codificate specificatamente per questa trama? la soluzione 'null' (che funziona ora) nella mia risposta lo rende più generico se è così. – hrbrmstr

+0

Sì. Sono hard-coded, quindi una soluzione generica è decisamente migliore. – eipi10

9

È inoltre possibile utilizzare theme_nothing() dal pacchetto cowplot:

require(cowplot) 
qplot(1:10, (1:10)^2, geom='line') + theme_nothing() + 
    scale_x_continuous(expand=c(0,0)) + 
    scale_y_continuous(expand=c(0,0)) + 
    labs(x = NULL, y = NULL) 

Purtroppo, è ancora necessario aggiungere labs(x = NULL, y = NULL), perché non v'è alcun modo in macchinari tema di ggplot2 per rimuovere completamente gli assi. E devi impostare expand=c(0,0) nei parametri della scala per assicurarti che la scala non si estenda oltre il tuo intervallo di dati.

Risultato:

enter image description here

Problemi correlati