2016-09-28 21 views
8

ggplot2 kullanarak grafikleri çiziyorum ve birden çok grafik (~ 51) yapmak için facet_wrap işlevine sahibim ancak hepsi bir sayfada görünüyor. Şimdi arama yaptıktan sonra ggplot2'nin grafikleri birden fazla sayfaya yerleştiremediğini öğrendim.ggplot2: Birden çok sayfa üzerinde düzlemler

Bunu yapmanın bir yolu var mı? Bu soruya (Multiple graphs over multiple pages using ggplot) baktım ve küçük bir başarı ile kodu denedim.

Grafiklerim için kodum, bir sayfada ~ 51 grafik üretiyor, bunları çok küçük ve zor görüyor, bunu bir pdf'ye sayfa başına 1 grafik basabiliyorsam, bu harika olurdu:

ggplot(indbill, aes(x = prey, y = weight), tab) + 
geom_polygon(aes(group = load, color = capture), fill = NA, size = 0.75) + 
facet_wrap(~ individual) + 
theme(axis.ticks.x = element_blank(), 
    axis.text.x = element_text(size=rel(0.5)), 
    axis.ticks.y = element_blank(), 
    axis.text.y = element_blank()) + 
xlab("") + ylab("") + 
guides(color = guide_legend(ncol=2)) + 
coord_radar() 

Birisi biraz kod yazıp bana açıklayabilirse, bu harika olurdu!

Teşekkürler! gibi

cevap

8

Bir seçenek sadece arsa, diyelim ki, artık kullandığınız aynı kodu kullanarak bir defada individual altı seviyeleri etmektir. Verilerinizin her bir alt kümesi için bir kez, birkaç kez yinelemeniz gerekir. Sen Baseball veri çerçevesini kullanarak bir örnek örnek verileri temin yüzden burada değil:

library(ggplot2) 
library(vcd) # For the Baseball data 
data(Baseball) 

pdf("baseball.pdf", 7, 5) 
for (i in seq(1, length(unique(Baseball$team87)), 6)) { 
    print(ggplot(Baseball[Baseball$team87 %in% levels(Baseball$team87)[i:(i+5)], ], 
        aes(hits86, sal87)) + 
    geom_point() + 
    facet_wrap(~ team87) + 
    scale_y_continuous(limits=c(0, max(Baseball$sal87, na.rm=TRUE))) + 
    scale_x_continuous(limits=c(0, max(Baseball$hits86))) + 
    theme_bw()) 
} 
dev.off() 

Yukarıdaki kod parsellerin dört sayfalarında, bir sayfaya altı yüzlere sahip her biriyle bir PDF dosyası üretecektir. Ayrıca altı yönleriyle her grup için dört ayrı PDF dosyaları tek oluşturabilirsiniz: daha fazla esneklik gerekiyorsa

for (i in seq(1, length(unique(Baseball$team87)), 6)) { 
pdf(paste0("baseball_",i,".pdf"), 7, 5) 
    ...ggplot code... 
dev.off() 
} 

Diğer bir seçenek, her seviye için ayrı arsa oluşturmaktır (yani, her benzersiz değer) Kıymetlendirme değişkeninin bir listesi ve tek tek tüm parselleri bir listede saklar. Ardından, her sayfadaki herhangi bir sayıyı düzenleyebilirsiniz. Muhtemelen buradaki aşırı sıkıntı, ama esnekliğin geldiği here's an example.

İlk olarak, tüm grafikleri oluşturalım. team87'u, profil sütunumuz olarak kullanacağız. Dolayısıyla, team87'un her seviyesi için bir çizim yapmak istiyoruz. Verileri team87'a bölerek ve verilerin her bir alt kümesi için ayrı bir çizim yaparak yaparız. Aşağıdaki kodda split, team87 numaralı her bir düzey için verileri ayrı veri çerçevelerine ayırır. lapply sarıcı, her bir takım için arsa oluşturmak üzere her veri alt kümesini ggplot'a sırayla besler. Çıkışı plist'a kaydediyoruz, (bu örnekte) 24 parselin bir listesi.

plist = lapply(split(Baseball, Baseball$team87), function(d) { 
    ggplot(d, aes(hits86, sal87)) + 
    geom_point() + 
    facet_wrap(~ team87) + 
    scale_y_continuous(limits=c(0, max(Baseball$sal87, na.rm=TRUE))) + 
    scale_x_continuous(limits=c(0, max(Baseball$hits86))) + 
    theme_bw() + 
    theme(plot.margin=unit(rep(0.4,4),"lines"), 
      axis.title=element_blank()) 
}) 

Şimdi bir PDF dosyasında altı grafik çizeceğiz. Aşağıda, biri her biri altı sayfalı, diğeri de dört sayfalı bir PDF dosyası olan dört ayrı PDF dosyası olan iki seçenek vardır. Ayrıca alt kısımdaki grafiklerden birine yapıştırdım. grid.arrange, eksen başlıklarını eklemek için left ve bottom argümanlarını kullanmak da dahil olmak üzere, paftaları düzenlemek için kullanıyoruz.

library(gridExtra) 

# Four separate single-page PDF files, each with six plots 
for (i in seq(1, length(plist), 6)) { 
    pdf(paste0("baseball_",i,".pdf"), 7, 5) 
    grid.arrange(grobs=plist[i:(i+5)], 
       ncol=3, left="Salary 1987", bottom="Hits 1986") 
    dev.off() 
} 

# Four pages of plots in one PDF file 
pdf("baseball.pdf", 7, 5) 
for (i in seq(1, length(plist), 6)) { 
    grid.arrange(grobs=plist[i:(i+5)], 
       ncol=3, left="Salary 1987", bottom="Hits 1986") 
} 
dev.off() 
+0

Hi @ eipi10! Bu harika çalıştı ve anlaşılması kolay oldu! Her ne kadar bir sorunum olsa da. Kodun bireylerimden birini sevmediği ve bu hatayı alıyorum gibi görünüyor. Bu tekil '= listeye girdikten sonra yazdırmayı durdurur (gList'teki grobs Hatası (705-70773 = liste (grobs = liste) (liste (x = 0,5, y = 0).5,: sadece "gList" içinde "grobs" izni verilir Herhangi bir yardım harika olurdu! – LearningTheMacros

+1

O kişinin veri üretilememesiyle sonuçlanan veriler hakkında bir şeyler var mı? Arsa yoksa, arsa kodunun çıktısı bir grob (grafik nesnesi) olmayacaktır. Örneğin, bu kişi için eksik olan tüm veriler veya böyle bir şey var mı? Çizginizi oluşturmayı deneyin, ancak bir veri çerçevesini ggplot ile yalnızca bir kişinin verileriyle besleyin ve ne olduğunu görün. Bu birey için verilere bakın ve bu konuda açıkça farklı bir şey olup olmadığını görün. – eipi10

+0

Eser, HubertL'nin önerisini kullandığımda yapıldı, bu yüzden bilmiyorum. Her iki durumda da cevabınızı anladım ve gelecekte bana yardımcı olacak. Tekrar teşekkürler! – LearningTheMacros

2

şey:

by(indbill, indbill$individual, function (x){ 
    ggplot(x, aes(x = prey, y = weight), tab) + 
    geom_polygon(aes(group = load, color = capture), fill = NA, size = 0.75) + 
    theme(axis.ticks.x = element_blank(), 
     axis.text.x = element_text(size=rel(0.5)), 
     axis.ticks.y = element_blank(), 
     axis.text.y = element_blank()) + 
    xlab("") + ylab("") + 
    guides(color = guide_legend(ncol=2)) + 
    coord_radar() 
} 
İlgili konular