Soru R - dosyayı dosyaya kaydet


Aşağıdaki sorunla ilgili yardımınıza minnettarım. Tek bir çizimi bir dosyaya kaydetmenin birkaç yolunu biliyorum. Sorum şu: Nasıl doğru bir şekilde kaydederim multiplot bir dosyaya

Başlamak için deneyimli bir R kullanıcısı değilim. Haritalarımı oluşturmak için ggplot2 kullanıyorum ve muhtemelen bahsetmem gereken başka bir şey de RStudio GUI'yi kullanıyorum. Bir örnek  R Cookbook dan, bir pencerede birden çok parsel oluşturabiliyorum.

Bu sözde multiplotu bir dosyaya (tercihen jpeg olarak) kaydetmek istiyorum, ancak bir şekilde bunu yapamıyorum.

Aşağıdaki gibi çoklulot oluşturuyorum:

##define multiplot function
    multiplot <- function(..., plotlist=NULL, cols) {
        require(grid)

        # Make a list from the ... arguments and plotlist
        plots <- c(list(...), plotlist)

        numPlots = length(plots)

        # Make the panel
        plotCols = cols                          # Number of columns of plots
        plotRows = ceiling(numPlots/plotCols) # Number of rows needed, calculated from # of cols

        # Set up the page
        grid.newpage()
        pushViewport(viewport(layout = grid.layout(plotRows, plotCols)))
        vplayout <- function(x, y)
            viewport(layout.pos.row = x, layout.pos.col = y)

        # Make each plot, in the correct location
        for (i in 1:numPlots) {
            curRow = ceiling(i/plotCols)
            curCol = (i-1) %% plotCols + 1
            print(plots[[i]], vp = vplayout(curRow, curCol ))
        }

    }

## define subplots (short example here, I specified some more aesthetics in my script)
plot1a <- qplot(variable1,variable2,data=Mydataframe1)
plot1b <- qplot(variable1,variable3,data=Mydataframe1)  
plot1c <- qplot(variable1,variable2,data=Mydataframe2)
plot1d <- qplot(variable1,variable3,data=Mydataframe2)  

## plot in one frame
Myplot <- multiplot(plot1a,plot1b,plot1c,plot1d, cols=2)

Bu istenen sonucu verir. Bir dosyaya kaydetmeye çalıştığımda sorun ortaya çıkıyor. Bunu RStudio'da (Export -> Plotu resim olarak kaydet) kullanarak el ile yapabilirim, ancak her şeyi bir komut dosyasında çalıştırmak isterim. Ben sadece subplot1d'yi (last_plot ()) ve tam bir tamsayıyı kaydetmeyi başaramıyorum.

Şimdiye kadar denediğim şey:

  1. Ggsave kullanarak

    ggsave(filename = "D:/R/plots/Myplots.jpg")
    

    Bu sadece kaydedilen alt-çizim 1d ile sonuçlanır.

  2. Jpeg (), print () ve dev.off () kullanma

    jpeg(filename = "Myplot.jpg", pointsize =12, quality = 200, bg = "white", res = NA, restoreConsole = TRUE)
    print(Myplot)
    dev.off()
    

    Bu tamamen beyaz bir görüntü ile sonuçlanır (sadece arka plandaki gibi). Yazdır (Myplot), NULL değerini döndürür.

Burada yanlış yaptığımdan emin değilim. Anlamaktansa, benim bir çözüm bulmaya çalışırken sıkışıp kalmamın sebebi R. Herkes yanlış yaptığımı açıklayabilir ve belki problemlerimi çözmenin bir yolunu önerebilir mi?


26
2017-07-30 12:18


Menşei


Ayrıca kullanabilirsiniz gridExtra :: grid.arrange (plot1a, plot1b, plot1c, plot1d, ncol = 2) - dickoa
GridExtra paketi, grid.arrange içermez, aynı işlevselliği sağlayan bir düzenleme olan removeGrob içerir. Ben de grid.arrange adında bir işlevi hatırlıyorum gibi görünüyor, belki de yazar paket içindeki işlev başlıklarını değiştirdi. - Paul Hiemstra
grid.arrange gridExtra içinde olmalıdır. Şüphesiz, yararlarından biri arrangeGrob vs multiplot ile uyumludur ggsaveve daha sonra kullanmak için kompozit kabı saklayabilirsiniz. - baptiste
Ben sadece jpeg'in muhtemelen en iyi seçenek olmadığını belirtmek isterim. Çizim raster bir görüntü olarak (örneğin, pdf veya eps değil) bitmelidir, bunun yerine png kullanın. Kayıpsız sıkıştırmayı kullanır, yani metin veya çizgiler gibi keskin kontrast bölgeleri etrafında hiçbir eser olmayacaktır. Sıkıştırma ayrıca, araziler gibi tek bir renkteki geniş alanlara sahip görüntüler için de harika çalışır. - quazgar


Cevaplar:


Çünkü Myplot multiplot işlevinizden döndürülen değerdir ve hiçbir şey döndürmez (işi grafikleri yazdırmaktır). Jpeg cihazı açıkken multiplot çağırmanız gerekiyor:

jpeg(filename = "Myplot.jpg", pointsize =12, quality = 200, bg = "white", res = NA, restoreConsole = TRUE)
multiplot(plot1a,plot1b,plot1c,plot1d, cols=2)
dev.off()

çalışmalı.


20
2017-07-30 12:26



Gerçekten bu kadar basit! Yaklaşımımın neden işe yaramadığını açıkladığınız için çok teşekkürler. - M_Vermeulen


Kullanmak örnek kod (R kitabı), benim için çalışıyor

png("chickweight.png")
multiplot(p1, p2, p3, p4, cols=2)
dev.off()

enter image description here


17
2017-07-30 12:29



Haklısınız, fakat kodunuz @M_Vermeulen'den biraz farklıdır, ilk önce 4 parselini bekler. multiplot ızgara nesnesini döndürmek için Bu olabilir grid.arrange bu davranışı gösteriyor mu? - Paul Hiemstra
@PaulHiemstra: Burada farklı bir yaklaşım olduğunu düşünmüyorum, örnek sayfasına bakınız. Asıl sorun @Spacedman tarafından çok iyi açıklandı. Ve evet grid.arrange aynı davranışı göster - dickoa
Kodunuz zaten @Spacedman'ın düzeltmesini içeriyor. png. - Paul Hiemstra
Her plotun boyutunu artırmak için neyse? - EntryLevelR


Ve bütünlük uğruna, ggsave sadece son arsa olan son baskılı ggplot nesnesini kaydettiğinden çalışmaz. Bu durum, çoklu grafik, ggplot nesnelerini toplam grafik aygıtının farklı alt kümelerine çizerek arsa oluşturması gerçeğinden kaynaklanır. Bir alternatif, ggplot nesnelerini bir büyük ggplot nesnesine birleştirerek ve ardından nesneyi yazdırarak grafiği oluşturmaktır. Bu ile uyumlu olurdu ggsave. Bu yaklaşım tarafından uygulanır arrangeGrob içinde gridExtra paketi.


6
2017-07-30 15:19



teknik olarak, arrangeGrob "bir büyük ggplot nesnesi" oluşturmaz, "düzenleme" sınıfının bir gTree döndürür, ve çocuk listesinde ggplots varsa, o zaman sınıf da "ggplot" dan fool ggsave için miras alır. - baptiste
Daha detaylı bilgi için teşekkürler. - Paul Hiemstra