No.02425 Rで度数分布の折れ線グラフを  【Rはじめました】 2007/01/24(Wed) 16:16

いつもお世話になります。またまた悩んでおります。お力添えお願いします。
species <- rep(c("A","B","C","D"),c(50,35,55,60))
area <- rep(1:5,40)
sex <- c(rep(1:2,each=2,times=25),rep(1:2,times=50))
TL <- c(rep(20:30,each=2,len=100),rep(25:35,len=100))+rnorm(200)
test.data <- data.frame(species=species,area=area,sex=sex,TL=TL)
というデータに対して,TLの度数分布を折れ線グラフで雌雄(sex)一緒に表示したいと思っております。最終的にはspeciesとareaで区分して複数のグラフを得たいと思っています。そこで,まず,青木先生の度数分布表を作るプログラム
http://aoki2.si.gunma-u.ac.jp/R/dosuu-bunpu.html
を参考に,
freq <- function(       x,                                    
lo,
hi,
w)
{
x <- x[!is.na(x)]
n <- length(x)
f <- table(cut(x, br = seq(lo, hi, w), right = FALSE))
if (n != sum(f)) {
stop
}
res <- cbind(f, f/n*100)
colnames(res) <- c("度数", "相対度数")
return(res)
}

male <- freq(test.data[sex == 1,]$TL,10,40,2)
female <- freq(test.data[sex == 2,]$TL,10,40,2)
matplot(male,typ="l",ylab="")
matplot(female,type="l",add=TRUE,lty=3)
としてみました。ところがこれでは,x軸の目盛りが,10:40ではなくて,行の順番となってしまいます。そこで,
matplot(male,typ="l",ylab="",axes=F)
matplot(female,type="l",add=TRUE,lty=3)
axis(1,10:40)
axis(2,0:20,tike=3)
など,色々試しておりますが,どうもうまくいきません。
どのようにしたら,x軸をデータの順番ではなくてデータの値にすることができるのでしょうか。

No.02426 Re: Rで度数分布の折れ線グラフを  【青木繁伸】 2007/01/24(Wed) 16:28

axis(1, at=1:15, labels=8+1:15*2)
のように,ラベルを描く x 座標を at で,描くラベルを labels で指定すればよいでしょうね。

No.02427 Re: Rで度数分布の折れ線グラフを  【Rはじめました】 2007/01/24(Wed) 16:45

青木先生,早速のご回答を誠にありがとうございました。
もう一つ教えて頂きたいのですが,上に示しましたグラフで,y軸を0:20で目盛りを2刻みというような指定をしたいのですが,うまくいきません。お教え頂けないでしょうか。

No.02431 Re: Rで度数分布の折れ線グラフを  【青木繁伸】 2007/01/24(Wed) 17:04

axis(2, at=0:10*2)
では?

No.02432 Re: Rで度数分布の折れ線グラフを  【takahashi】 2007/01/24(Wed) 17:06

hist()を使って,こういうやり方もありますということで。
H <- lapply(levels(factor(test.data$sex)),
function(s) hist(test.data$TL[test.data$sex==s], plot=F, breaks=10+0:15*2))
matplot(H[[1]]$mids, sapply(H, "[[","count"), type="o",
pch=1,yaxp=c(0,20,10),ylim=c(0,20))

No.02435 Re: Rで度数分布の折れ線グラフを  【Rはじめました】 2007/01/24(Wed) 17:32

ありがとうございました。単純なことでお手を煩わせてしまい,申し訳ありません。これら軸のことで,あれこれ試しながら3日ほど悩んでおりました。

ここで,同じデータを用いて,species別,area別にまとめて20個(5*4)のグラフを作りたいと考えております。そこで,

speciesの"A","B","C","D"を1:4におきかえて
species <- rep(c(1:4),c(50,35,55,60))
とした上で,データフレームを作り,以下のようにしてみましたが,どうもうまくいきません。どこに問題があるのでしょうか。お手数かけて申し訳ありませんが,診て頂けないでしょうか。よろしくお願い致します。
par(mfrow=c(5,4),mar=c(2,2,1,1),oma=c(3,3,1,1))

for(i in 1:5){
for(j in 1:4){
selected <- is.element(test.data$area,i) &
is.element(test.data$species,j)
print(sum(selected))

male <- freq(test.data[sex == 1,]$TL[selected],10,40,2)
female <- freq(test.data[sex == 2,]$TL[selected],10,40,2)

matplot(male,typ="l",ylab="",axes=F)
matplot(female,type="l",add=TRUE,lty=3)
axis(1, at=1:15, labels=8+1:15*2)
axis(2, at=0:8*5)

mtext("Frequency(%)",side=2,line=1,outer=TRUE)
mtext("TL(cm)",side=1,line=1,outer=TRUE)
}}

No.02436 Re: Rで度数分布の折れ線グラフを  【Rはじめました】 2007/01/24(Wed) 17:37

takahashiさま,ありがとうございます。見る前に送ってしまいましたが,教えて頂いた方法の方が単純でよいですね。この方法でもやってみます。

No.02437 Re: Rで度数分布の折れ線グラフを  【takahashi】 2007/01/24(Wed) 17:47

ここまでくると最初のうちはあまりオススメしませんが,
species <- rep(c("A","B","C","D"),c(50,35,55,60))
area <- factor(rep(1:5,40))
sex <- factor(c(rep(1:2,each=2,times=25),rep(1:2,times=50)))
TL <- c(rep(20:30,each=2,len=100),rep(25:35,len=100))+rnorm(200)
test.data <- data.frame(species=species,area=area,sex=sex,TL=TL)

par(mfrow=c(5,4),mar=c(2,2,1,1),oma=c(3,3,1,1))
by(test.data,list(test.data$species,test.data$area),
function(dat){H<-lapply(levels(dat$sex), function(s) hist(dat$TL[dat$sex==s], plot=F, breaks=10+0:15*2))
matplot(H[[1]]$mids, sapply(H, "[[","count"), type="o", pch=1,yaxp=c(0,20,10),ylim=c(0,20),
main=paste(dat[1,"species"],dat[1,"area"]))})
mtext("Frequency(%)",side=2,line=1,outer=TRUE)
mtext("TL(cm)",side=1,line=1,outer=TRUE)

No.02438 Re: Rで度数分布の折れ線グラフを  【Rはじめました】 2007/01/24(Wed) 17:58

ありがとうございます。初めて見る関数などもあり,中身まではすぐには理解できませんが,やってみると見事にうまくできました。引き続き勉強させて頂きます。
お二方に心より感謝致します。。

No.02439 Re: Rで度数分布の折れ線グラフを  【青木繁伸】 2007/01/24(Wed) 18:02

> 以下のようにしてみましたが,どうもうまくいきません。どこに問題があるのでしょうか。お手数かけて申し訳ありませんが,診て頂けないでしょうか。

というのは,困ります。
せめて,どこがどうなるのが「うまくいかない」のか位は,言葉で述べるべきでしょう。
人の書いたプログラム全部をチェックするのは,しんどい。

「うまくいかない」ところではないと思うが
mtext("Frequency(%)",side=2,line=1,outer=TRUE)
mtext("TL(cm)",side=1,line=1,outer=TRUE)
は,for ループの外に置かないと,文字が微妙にずれて何回も重ね描きされておりますよ。

No.02451 Re: Rで度数分布の折れ線グラフを  【Rはじめました】 2007/01/25(Thu) 14:38

大変失礼致しました。改めて質問させて頂きます。
species <- rep(c(1:4),c(50,35,55,60))
area <- factor(rep(1:5,40))
sex <- factor(c(rep(1:2,each=2,times=25),rep(1:2,times=50)))
TL <- c(rep(20:30,each=2,len=100),rep(25:35,len=100))+rnorm(200)
test.data <- data.frame(species=species,area=area,sex=sex,TL=TL)
というデータに対して,speciesとarea別にsex1と2の度数分布の線グラフを描きたいと考えております。まず,
freq <- function(x,lo,hi,w){
x <- x[!is.na(x)]
n <- length(x)
f <- table(cut(x, br = seq(lo, hi, w), right = FALSE))
if (n != sum(f)) {
stop
}
res <- cbind(f/n*100)
colnames(res) <- c("相対度数")
return(res)
}
に よって,度数分布を作る関数を定義しました。ここで,以下のようにareaとspeciesをそれぞれi in 1:5 と j in 1:4 として 5×4の20個のグラフを描こうとしていますが,15個しかグラフが出力されません。グラフのフレームは20個表示されるものの,データが棒グラ フで示されるのが15個だけです。上でtakahasiさまに教えて頂いた方法では,25個のグラフが出力されるので,species4のデータが無いと いうことはないのです。下のどこかに不備があるようですが,どこが間違っているのか分かりません。お気づきの方おられましたら,ご教授頂きたく,お願い致 します。
par(mfrow=c(5,4),mar=c(2,2,1,1),oma=c(3,3,1,1))

for(i in 1:5){
for(j in 1:4){
selected <- is.element(test.data$area,i) & is.element(test.data$species,j)
print(sum(selected))
male <- freq(test.data[sex == 1,]$TL[selected],10,40,2)
female <- freq(test.data[sex == 2,]$TL[selected],10,40,2)
matplot(male,typ="l",ylab="",axes=F,yaxp=c(0,40,10),ylim=c(0,40))
matplot(female,type="l",add=TRUE,lty=3)
axis(1, at=1:15, labels=8+1:15*2)
axis(2, at=0:8*5)
}
}
mtext("Frequency(%)",side=2,line=1,outer=TRUE)
mtext("TL(cm)",side=1,line=1,outer=TRUE)

No.02452 Re: Rで度数分布の折れ線グラフを  【takahashi】 2007/01/25(Thu) 14:53

male <- freq(test.data[sex == 1,]$TL[selected],10,40,2)
female <- freq(test.data[sex == 2,]$TL[selected],10,40,2)
が間違い。正しくは
male <- freq(test.data[test.data$sex == 1 & selected,]$TL,10,40,2)
female <- freq(test.data[test.data$sex == 2 & selected,]$TL,10,40,2)
または,
male <- freq(test.data$TL[test.data$sex == 1 & selected],10,40,2)
female <- freq(test.data$TL[test.data$sex == 2 & selected],10,40,2)

No.02453 Re: Rで度数分布の折れ線グラフを  【Rはじめました】 2007/01/25(Thu) 15:00

早速ありがとうございました。うまくいきました。

● 「統計学関連なんでもあり」の過去ログ--- 040 の目次へジャンプ
● 「統計学関連なんでもあり」の目次へジャンプ
● 直前のページへ戻る