web-dev-qa-db-ja.com

R正規化してから、2つのヒストグラムをRに一緒にプロットします

2つのヒストグラムを並べて(バーが隣り合った1つのプロットのように)プロットし、Rでオーバーレイする方法や、データを正規化する方法について質問する投稿がいくつかあることに気付きました。私が見つけたアドバイスに従って、私はどちらか一方を行うことができますが、両方の操作を行うことはできません。

これがセットアップです。長さが異なる2つのデータフレームがあり、各dfのオブジェクトのボリュームをヒストグラムとしてプロットしたいと思います。たとえば、データフレーム1の数が.1〜.2 um ^ 3の間にあり、データフレーム2の数が.1〜.2 um ^ 3の間にあるなどと比較します。これを行うには、オーバーレイまたはサイドバイサイドが最適です。

1つのデータフレームには他のデータフレームよりも多くの測定値があるため、明らかに正規化する必要があります。

read.csv(ctl)
read.csv(exp)
h1=hist(ctl$Volume....)
h2=hist(exp$Volume....

#to normalize#

h1$density=h1$counts/sum(h1$counts)*100
plot(h1,freq=FALSE....)
h2$density=h2$counts/sum(h2$counts)*100
plot(h2,freq=FALSE....)

これで、次の方法を使用して、正規化されていないデータをオーバーレイすることに成功しました: http://www.r-bloggers.com/overlapping-histogram-in-r/ そしてこの方法でも:- 2つのヒストグラムを一緒にプロットする

しかし、正規化されたデータをオーバーレイする方法に関しては行き詰まっています

8
Harry B

ggplot2は、サイズが等しくないグループの正規化されたヒストグラムをプロットすることを比較的簡単にします。偽のデータの例を次に示します。

library(ggplot2)

# Fake data (two normal distributions)
set.seed(20)
dat1 = data.frame(x=rnorm(1000, 100, 10), group="A")
dat2 = data.frame(x=rnorm(2000, 120, 20), group="B")
dat = rbind(dat1, dat2)

ggplot(dat, aes(x, fill=group, colour=group)) +
  geom_histogram(breaks=seq(0,200,5), alpha=0.6, 
                 position="identity", lwd=0.2) +
  ggtitle("Unormalized")

ggplot(dat, aes(x, fill=group, colour=group)) +
  geom_histogram(aes(y=..density..), breaks=seq(0,200,5), alpha=0.6, 
                 position="identity", lwd=0.2) +
  ggtitle("Normalized")

enter image description here

オーバーレイされた密度プロットを作成する場合は、それも実行できます。 adjustは帯域幅を制御します。これはデフォルトですでに正規化されています。

ggplot(dat, aes(x, fill=group, colour=group)) +
  geom_density(alpha=0.4, lwd=0.8, adjust=0.5) 

enter image description here

PDATE:あなたのコメントに答えて、次のコードがそれを行うはずです。 (..density..)/sum(..density..)は、2つのヒストグラムの合計密度が合計1になり、個々のグループの合計密度が合計0.5になります。したがって、各グループの合計密度を個別に1に正規化するには、2を掛ける必要があります。一般に、nを掛ける必要があります。ここで、nはグループの数です。これはちょっと厄介なようで、もっとエレガントなアプローチがあるかもしれません。

library(scales) # For percent_format()

ggplot(dat, aes(x, fill=group, colour=group)) +
  geom_histogram(aes(y=2*(..density..)/sum(..density..)), breaks=seq(0,200,5), alpha=0.6, 
                 position="identity", lwd=0.2) +
  scale_y_continuous(labels=percent_format())

enter image description here

15
eipi10