16

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

この質問はかなり古いことを理解しており、for ループで ggplot2 グラフの名前を変更することに関する回答とhttps://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()

このフォーラムの質問に対する明らかな回答を見逃していた場合はお詫び申し上げます。また、ご案内いただければ幸いです。私の説明が明確であることを願っています。そうでない場合は、必要な説明についてお知らせください。

ありがとう!

4

2 に答える 2

18

次の方法でコードを大幅に簡素化できます。

  1. 複数のプロットを手動で配置するのではなく、ファセットを使用する
  2. meltパッケージ内の関数を使用してデータを融解するreshape2
  3. これは、ループを削除できることを意味します

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

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)

結果のグラフィック:

確率:

ここに画像の説明を入力

周波数

ここに画像の説明を入力

于 2012-07-06T08:03:59.500 に答える
7

を使用して美学をマッピングする代わりに、:aesを使用した方がよい場合があります。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')
 }

少なくとも、それは私にとってはうまくいきました。これにより、データをサブセット化する必要がなくなり、引用符で囲まれた名前でプロットする列を参照できるようになります。

于 2012-07-06T07:49:28.840 に答える