2012-07-06 15 views
14

私は、ユーザーがデータから列を選択し、それぞれのヒストグラムをプロットできるRコードを作成しています。したがって、私は 'for'ループを使用して、ggplot2ライブラリを使用して必要な数のプロットを生成し、それらを単一のリストに保存しています。しかし、私が直面している問題は、 'for'ループが繰り返されるたびに、リスト内のすべてのオブジェクトが同じプロットを格納しているということです。したがって、最終的な出力はヒストグラムのグリッドで構成され、異なるラベルが付けられていますが、同じ(最後の)列が示されています。R:ggplot2プロットをリストに保存する

私はこの質問がかなり古くて、renaming ggplot2 graphs in a for loophttps://stat.ethz.ch/pipermail/r-help/2008-February/154438.htmlの回答が有用な出発点になることを理解しました。

私はプロットを生成するためにRで利用可能な標準的なSwiss Fertilityデータセットを使用しました。ここでは、コードは次のようになります - 私はこのフォーラムで質問に対する明確な答えを見逃していると、あなたはそれに向かって私を指示することができれば感謝しなければならない場合、私は謝罪

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() 

。私の説明がはっきりしていることを願っています。そうでない場合は、必要な説明を私に教えてください。

ありがとうございます!代わりにaesを使用してマッピングの美学の

答えて

5

、あなたがaes_stringを使用したほうが良いかもしれません。少なくとも、私のために働いた

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

。これにより、データをサブセット化する必要がなくなり、引用する名前でプロットする列を参照することができます。

+0

も私のために働いた。ありがとう! –

16

あなたは非常にして、コードを単純化することができます。これは、あなたがループを削除することができることを意味し、パッケージreshape2

  • に機能meltでデータを溶融複数のプロット
  • のファセットを使用するのではなく、手動で配置

    ここでは、コードを完全に書き直したもので、ループは見えません。

    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) 
    

    得られたグラフィックス:

    確率:

    enter image description here

    周波数

    enter image description here

  • +0

    これは素晴らしいようです!ありがとう! –

    関連する問題