2012-07-06 13 views
14

Kullanıcıların bir veriden sütun seçmesini ve her biri için histogram çizebilmesini sağlayan bir R kodu yazıyorum. Bu nedenle, ggplot2 kütüphanesini kullanarak gerekli sayıda çizim üretmek ve bunları tek bir listeye kaydetmek için bir 'for' döngüsü kullanıyorum. Ama karşılaştığım problem, 'for' döngüsünün her yinelemesinde, listedeki tüm nesnelerin aynı grafiği saklamasıdır. Sonuç olarak, son çıktı farklı bir şekilde etiketlenmiş ancak aynı (son) sütunu gösteren bir grafikler ızgarası içerir.R: Bir listede ggplot2 grafiği kaydetme

Bu sorunun oldukça eski olduğunu ve renaming ggplot2 graphs in a for loop ve https://stat.ethz.ch/pipermail/r-help/2008-February/154438.html numaralı yanıtların yararlı bir başlangıç ​​noktası olduğunu öğrendim.

Grafik görüntü Grafiklerdeki metinlerin tercümesi. İşte kod: - Bu forumda soruya açık bir cevap kaçırmış ve ona doğru beni yönlendirmek eğer minnettar olacaktır özür dilerim

data_ <- swiss 
data_ <- na.omit(data_) 

u <- c(2, 3, 4, 5, 6) 
plotData <- data_[,u] 
bw <- 5 
plotType <- 'probability' 

library(ggplot2) 
library(gridExtra) 

histogramList <- vector('list', length(u)) 

if(plotType=='probability') 
{ 
for(i in 1:length(u)) 
{ 
    indexDataFrame <- data.frame(plotData[,i]) 
    probabilityHistogram <- ggplot(indexDataFrame, aes(x=indexDataFrame[,1])) 
    histogramList[[i]] <- probabilityHistogram + geom_histogram(aes(y=..density..),  binwidth=bw, colour='black', fill='skyblue') + geom_density() + scale_x_continuous(names(plotData)[i]) + opts(legend.position='none') 
} 
} else 
if(plotType=='frequency') 
{ 
for(i in 1:length(u)) 
{ 
    indexDataFrame <- data.frame(plotData[,i]) 
    probabilityHistogram <- ggplot(indexDataFrame, aes(x=indexDataFrame[,1])) 
    histogramList[[i]] <- probabilityHistogram + geom_histogram(aes(y=..count..), binwidth=bw, colour='black', fill='skyblue') + geom_density() + scale_x_continuous(names(plotData)[i]) + opts(legend.position='none') 
} 
} 

arg_list <- c(histogramList, list(nrow=3, ncol=2)) 
#jpeg('histogram', width=1024, height=968) 
do.call(grid.arrange, arg_list) 
#graphics.off() 

. Umarım açıklamam açık olur ve değilse, lütfen gerekli açıklamaları bana bildirin.

Teşekkürler! Bunun yerine aes kullanarak haritalama estetik

cevap

5

, sen aes_string kullanarak daha iyi olabilir: en azından benim için çalıştı

for(i in 1:length(u)) 
{ 
    probabilityHistogram <- ggplot(plotData, aes_string(x=names(plotData)[i])) 
    histogramList[[i]] <- probabilityHistogram + geom_histogram(aes(y=..density..),  binwidth=bw, colour='black', fill='skyblue') + geom_density() + scale_x_continuous(names(plotData)[i]) + opts(legend.position='none') 
} 

. Bu, verilerinizi altetmek zorunda kalmaz ve alıntılanan isme göre çizmek istediğiniz sütunu referans göstermenize izin verir.

+0

benim için de çalıştı. Teşekkürler! –

16

Sen ölçüde kodunuzu kolaylaştırabilirsiniz: Bu döngü kaldırmak anlamına gelir paketin reshape2

  • işlev melt ile verilerinizi Erime birden araziler
  • yönleriyle kullanma yerine elle düzenlenmesi

    İşte kodunuzun tam bir yeniden yazımı, görünürde bir döngü olmadan.

    data_ <- swiss 
    data_ <- na.omit(data_) 
    
    u <- c(2, 3, 4, 5, 6) 
    plotData <- data_[,u] 
    bw <- 5 
    plotType <- 'frequency' 
    
    library(ggplot2) 
    library(reshape2) 
    
    mdat <- melt(plotData) 
    
    if(plotType=='probability'){ 
        ph <- ggplot(mdat, aes(value)) + 
        geom_histogram(aes(y=..density..), binwidth=bw, colour='black', fill='skyblue') + 
        geom_density() + 
        facet_wrap(~variable, scales="free") 
    } 
    
    if(plotType=='frequency'){ 
        ph <- ggplot(mdat, aes(value)) + 
        geom_histogram(aes(y=..count..), binwidth=bw, colour='black', fill='skyblue') + 
        geom_density() + 
        facet_wrap(~variable, scales="free") 
    } 
    
    print(ph) 
    

    Elde edilen grafik:

    Olasılık:

    enter image description here

    Frekans

    enter image description here

  • +0

    bu harika görünüyor! Teşekkürler! –