2015-03-15 13 views
9

Birden çok grafiği gridExtra::grid.arrange kullanarak tek bir görüntüye yerleştiriyorum ve birleşik bir çizimi, bir işlev içinde bir işlevden döndürülebilecek bir nesne olarak kaydetme seçeneğine sahip olmak istiyorum iade edilen nesnelerin listesi. İdeal olarak, arsa nesnesini yazdırmadan bunu yapmak istiyorum.gridExtra :: grid.arrange nesnesini bir nesneye depolayın

Aşağıdaki kod, iki nokta oluşturur, bunları grid.arrange ile birleştirir ve sonucu x'a kaydetmeye çalışır. Ancak, x, NULL için değerlendirir ve çizim yazdırılır. grid.arrange belgeleri bana arrangeGrob işaret eder ve plot=FALSE kullanarak çizme devre dışı bırakılabilir önerir, ancak bunu denediğimde bir hata alıyorum çünkü FALSE bir grob nesnesi değil.

Anlamadığım şeyler için herhangi bir öneriniz var mı?

# R under development 
# Windows 7 (32 bit) 
# ggplot2 1.0.0 
# gridExtra 0.9.1 

p1 <- ggplot(mtcars, aes(x=factor(cyl), y=mpg)) + geom_boxplot() 

p2 <- ggplot(mtcars, aes(x=factor(cyl), y=wt)) + geom_boxplot() 

x <- gridExtra::grid.arrange(p1, p2) 

x 

Yorumlar için bu düzenlemeyi ekliyorum. arrangeGrob ile denediğimde hiç çıktı almıyorum.

> gridExtra::arrangeGrob(p1, p2) 
> print(gridExtra::arrangeGrob(p1, p2)) 
Error: No layers in plot 
> x <- gridExtra::arrangeGrob(p1, p2) 
> x 
Error: No layers in plot 
+5

'düzenlemekGrob' yerine – hrbrmstr

+1

@hrbrmstr kullanmayı deneyin: Küçük bir cevabın faydalı olacağını düşünüyorum. Yardım sayfası, bu örnekte oldukça yararsızdır ve bu, biraz tecrübemize rağmen başımın tepesine cevap verebilecek bir şey değildi. –

+0

Aslında "düzenlemekGrob" ile garipleşiyor (bu kodun yorumlarda biçimlendirilmediğini unutmaya devam ediyorum, bu yüzden soruya bir değişiklik yaptım). – Benjamin

cevap

2

Eğer gridExtra yük değildi çünkü Düzenlemenizle kod düzgün çalışmaz.

library(gridExtra) 
y <- arrangeGrob(p1, p2, ncol = 1) 
class(y) 
#[1] "gtable" "grob" "gDesc" 
grid.draw(y) 

enter image description here

Düzenleme: grid şimdi ithal edildiğinden sürümü 2.0.0 beri, benim yorum hakkında grid aşağıda bağımlılık, artık geçerli değil.

Düzenleme: gridExtra sürümü ile> = 2.0.0, takmak ya paket için gerek yoktur

p <- ggplot2::qplot(1,1) 
x <- gridExtra::arrangeGrob(p, p) 
grid::grid.draw(x) 
+0

İlginç. Beklediğim davranış değil bu. Belki de düşündüğüm gibi '' 'operatörünü anlamıyorum. Beni düzelttiğin için teşekkürler. – Benjamin

+0

Üzgünüz, 'gridExtra' yüklendikten sonra 'gridExtra :: 'gerekmez, düzenlemeye bakın. Rica ederim! – tonytonov

+0

Paketleme paketini yükledikten sonra "gridExtra ::' 'a ihtiyacım yok. '' 'Operatörünü kullanıyordum çünkü bir pakette bu işleve sahibim ve paketimi yüklerken arama paketine ek paketler yüklemekten kaçınmaya çalışıyorum. Kütüphaneyi yükleme ya da '::' kullanarak aynı sonuçları üretebileceğini düşünmüştüm. Görünüşe göre durum böyle değil. – Benjamin

2

Komik bu yüzden son zamanlarda istendi o - Ben bu sorun haline koşuyordu yanı bu hafta ve biraz zorlu bir şekilde çözebildi, ama daha mutlu olduğum başka bir çözüm bulamadım.

Sorun 1: ggplotGrob Emin ggplot2 yüklenir yapmak zorunda

bulunamadı. Neler olup bittiğini tam olarak anlamadım (itiraf etmeyi tam olarak anlamadığımı itiraf etmekteyim/bağlı/takılıyorum/etc), ancak aşağıdaki düzeltmelerde bunu düzeltiyor. Bu çok tehlikeli ise geribildirime açık olurdum.

if (!"package:ggplot2" %in% search()) { 
    suppressPackageStartupMessages(attachNamespace("ggplot2")) 
    on.exit(detach("package:ggplot2")) 
} 

başkası this blog post bağlantılı ve bunun yanı çalışır, ancak benim (non-tam) anlayışından, bu çözüm daha az korkunç olduğunu düşünüyorum. Bence.

Sorun 2: Çok keşfettiği gibi arsa

hiçbir katmanları, bu sorunu sabitleme bize grid.arrange kullanmasına izin verir, ama bu NULL döner ve bir nesneye tasarrufu izin vermez. Bu yüzden ben de arrangeGrob kullanmak istedim ama gridExtra zaten yüklü değilken de yukarıdaki hataya koştum. Düzeltmeyi problem 1'den tekrar uygulamak işe yaramıyor gibi görünüyor (belki de paket çok erken ayrılıyor mu?). AMA düzenleme GET grid::grid.draw arayarak hatasız olarak yazdırdığını fark ettim. Bu yüzden düzenlemeGrob'un çıktısına özel bir sınıf ekledim ve basitçe ızgara çağıran bir genel yazdırma yöntemi ekledim.şimdi açıkça yüklenmiş hiçbir paketleri ile taze R oturumu açabilirsiniz,

f <- function() { 
    plot <- gridExtra::arrangeGrob(...) 
    class(plot) <- c("ggExtraPlot", class(plot)) 
    plot 
} 
print.ggExtraPlot <- function(x, ...) { 
    grid::grid.draw(x) 
} 

Yaşasın çizmek ve ben başarıyla Grob yaratan bir işlevi çağırmak ve ileride yazdırabilirsiniz!


in my package on GitHub eylem kodunu görebilirsiniz.