12/7 ヒストグラム

こんにちは。あと20日以上も書くことがあるのか途方に暮れています。善処します。
今回はヒストグラムの書き方です。せっかくなのでirisを使わず、データを作ってみましょう。

以下のスクリプトでは平均が1から10の正規分布についてそれぞれ500個の値を取得し、偏りがありつつばらついた値の集合を作成しています。また、ついでに正規分布を規定する標準偏差をランダムに生成することでばらつきを増強させています。

v1 <- NULL
for(i in seq(1,10)){
  v1 <- c(v1,rnorm(500,mean = i,sd=sample(c(0.5,1,1.5,2),1)))
  }

このような値の分布を俯瞰するにはヒストグラムが最適です。ggplotで描くには以下のようにします。

v1.df <- data.frame(val=v1)
ggplot(v1.df,aes(x=val))+
  theme_classic()+
  geom_histogram(bins=40)

ちなみにbinの値を変えると1区間の幅を変えられます。以下はbin=80とした例です。

bin=80

一応色も変えてみましょう。ヒストグラムの色を変えるときは塗りつぶしになるので、引数としてcolではなくfillを用います。aes()の中に含めるかどうかは今度説明します。

g <- ggplot(v1.df,aes(x=val))+
  theme_classic()+
  geom_histogram(bins=40,fill="forestgreen")
ggsave("fig/1207_2.jpeg",g,width = 12,height = 7,units = "cm")

続いてレプリケートを取ってみましょう。同じオブジェクトを生成してrep1,rep2のデータフレームを作成します。

v2 <- NULL
for(i in seq(1,10)){
  v2 <- c(v2,rnorm(500,mean = i,sd=sample(c(0.5,1,1.5,2),1)))
}

df.norm <- data.frame(rep1=v1,rep2=v2)

rep1の値をx軸、rep2の値をy軸として散布図を描いてみます。再現性のある実験系か確かめるためにこのようなプロットはよく描かれます。

ggplot(df.norm,aes(x=rep1,y=rep2))+
  theme_classic()+
  geom_point()

無茶苦茶な分布で生成したせいで微妙にいびつですね。
二次元空間上での度数分布を示すために、ggplotには二次元ヒストグラムも実装されています。geom_hex()を実行してみましょう。

g <- ggplot(df.norm,aes(x=rep1,y=rep2))+
  theme_classic()+
  geom_hex(bins=40)+
  scale_fill_gradient(low = "grey88",high = "deeppink2")
ggsave("fig/1207_4.jpeg",g,width = 15,height = 12,units = "cm")

うーんあんまり好きじゃないですね。geom_pointに戻ってドットを透過処理しましょう。

library(RColorBrewer)
my_color <- adjustcolor("deeppink2",alpha=0.1)
g <- ggplot(df.norm,aes(x=rep1,y=rep2))+
  theme_classic()+
  geom_point(col=my_color,shape=16,size=2)
ggsave("fig/1207_5.jpeg",g,width = 15,height = 12,units = "cm")

僕はこっちのほうが好きですね。好みに応じて使い分けてください。

コメントする