2015-07-06 19 views
8

Bazı fraktallar oluşturmaya çalışıyorum ve ggplot ile kenar boşluklarıyla ilgili bir sorum var. R. fraktalları oluşturmak için aşağıdaki kodu kullanıyorum.R'de ggplot kullanırken, çizim alanını çevreleyen kenar boşluklarını nasıl kaldırabilirim?

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.') 

Çizim alanını çevreleyen kenar boşluklarını kaldırmak için fikirler arıyorum. 'Par', xaxes/yaxes, last_plot() + labs (x = NULL, y = NULL), vb. Gibi parametrelerin ayarlanması gibi bir sürü hileyi denedim, fakat hiçbir şey işe yaramıyor gibi görünüyor.

Bu zorlu kenar boşluğunu arsadan kaldırma fikri olan var mı? Şeffaf bir arka plan oluşturmayı da düşündüm, ama kenar boşluklarını kesmek zorunda kaldım - kaçınmak istediğim bir adım.

enter image description here

+2

birim, örneğin, 'plot.margin = birim olarak 'null' kullanılarak deneyin ggplot2 güncellenmesi (C (0, 0, 0, 0)" null ")' – hrbrmstr

cevap

7

ggplot düzeni sadece arsa panelini seçer bir yaklaşım. Ggplot oluşturur, çizim panelindeki elemanları element_blank'e ayarlar ve x ve y ölçeklerinin genişletilmesine neden olmaz. Daha sonra ggplot grob'u oluşturur, böylece çizim paneli sadece düzenden seçilebilir.

küçük düzenleme: 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 ")' paneli seçmek için daha okunabilir olabilir – baptiste

7

kodunuzu kullandıktan sonra, ben daha net aradığınız ne olduğunu görmek. Bu:

etiketleri kaldırmak zorunda
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 

x & y ekseni ve set sert sınırlarını değil-genişletin. null s da önemlidir.

Bu

da & parametreleri gb <- ggplotGrob(gg) yapıyor ve elle Grobs düzenleyerek yapılabilir, ama bu muhtemelen ihtiyacın olanı alır düşünüyorum.

+0

Veya, tüm bu tema ifadeleri yerine, cowplot paketinden 'theme_nothing()' öğesini kullanın. Yine de temelde aynı şey. –

+0

Balıklara öğretme… ve sanırım "boş" kelimesi, "satırlar" dan daha iyi çalışır, eğer bellek tamamen boşluktan kurtulmaya yararsa, o zaman grob seviyesinde doğrulanabilir (daha sonra kontrol edebilirim) . – hrbrmstr

+0

Bu uygulamada 'null'un satırlardan daha iyi bir ünite seçimi olup olmadığını kesinlikle bilmek isterim, lütfen bana ne bulduğunuzu bildirin.Önsel, 'null' gereksiz bir ek yük oluşturur, çünkü arsadaki diğer elementlerin büyüklüğüne bağlı olarak büyüyebilen ve küçülecek göreli bir birimdir. –

2

Negatif çizim kenar boşlukları ayarlayarak ve eksen başlıklarını NULL olarak ayarlayarak beyaz kenarlıktan kurtulmayı başardım. Aşağıdaki kodda düzenlemeleri işaretledim. Ayrıca cowplot paketinden theme_nothing() kullanabilirsiniz

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

bu arsa için özel olarak kodlanmış' plot.margin' girdileridir? Cevabımdaki “null” çözümü (şimdi çalışır), eğer daha fazla jenerik yaparsa. – hrbrmstr

+0

Evet. Onlar kodlanmış, bu yüzden jenerik bir çözüm kesinlikle daha iyi. – eipi10

9

:

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) 

Maalesef hala tamamen eksenleri kaldırmak için ggplot2 teması makinelerinde yolu yoktur, çünkü labs(x = NULL, y = NULL) eklemeniz gerekir. Ölçeğin veri aralığınızın ötesine geçmediğinden emin olmak için ölçek parametrelerinde expand=c(0,0)'u ayarlamanız gerekir.

Sonuç:

enter image description here

İlgili konular