No.01697 Rのplotについて  【Rはじめました】 2006/11/30(Thu) 17:31

大変初歩的なことで,こちらでお聞きするのも申し訳ないのですが,朝から本やらネットで調べても,思うようにできないので,質問させて頂きます。
species <- c("A","B","A","C","D","E","A","B","E","A","C","B","D")
length <- c(13,20,14,18,18,13,14,17,18,14,19,20,15)
data <- data.frame(species=species, length=length)
というデータに対して,
data1 <- data[data$species == "A" | data$species == "E" | data$species == "D",]
data2 <- data[data$species == "C" | data$species == "B" | data$species == "E",]
data3 <- data[data$species == "B" | data$species == "E" | data$species == "A",]
data4 <- data[data$species == "C" | data$species == "D" | data$species == "E",]

data1$species<-factor(data1$species)
data2$species<-factor(data2$species)
data3$species<-factor(data3$species)
data4$species<-factor(data4$species)

par(mfrow=c(2,2))
boxplot(length~species,data=data1)
boxplot(length~species,data=data2)
boxplot(length~species,data=data3)
boxplot(length~species,data=data4)
と して,4つのplotを描きました。ここで,左端の中央に横向きに"length"と入れたいのですが,うまくできません。左上のplotでylab= "length"とすることも考えたのですが,左の内部マージンを広く取る必要があるため,右側のplotの左内部マージンも広がってしまい,右側と左側 のplotが離れてしって不格好です。また,これだと左上で,左側中央にはもって来れません。
text( )も試しましたが,うまくいきません。text( )はデータ領域にしか挿入できないのでしょうか。
左側の外部マージンにラベルを挿入するにはどうすればよいのでしょうか。
また,4つのplotの縦軸目盛りを統一する方法があれば,併せてご教授頂きたく,お願い致します。

No.01699 Re: Rのplotについて  【青木繁伸】 2006/11/30(Thu) 18:15

> 左端の中央に横向きに"length"と入れたい

> これだと左上で,左側中央にはもって来れません

よくわかりませんが,それぞれの図の ylabel を描きたいということですか?
それぞれの boxplot の後に,mtext を使ってみてください。縦軸との距離は line=* で指定できます。
boxplot(length~species,data=data1)
mtext("length", side=2, line=3)

No.01700 Re: Rのplotについて  【Rはじめました】 2006/11/30(Thu) 18:30

早速ありがとうございます。
それぞれの図の軸にラベルを付けると,上下に2つおなじ"length"という文字が並ぶことになると思いますが,そうではなく,一括して上下にまたがるように一つのラベルを付けたいのです。
良い方法があれば,お願いします。

No.01701 Re: Rのplotについて  【青木繁伸】 2006/11/30(Thu) 18:33

プログラムは,似た操作をするのに繰り返しが多いので,少しだけすっきりと書くことができます。
species <- c("A","B","A","C","D","E","A","B","E","A","C","B","D")
length <- c(13,20,14,18,18,13,14,17,18,14,19,20,15)
set <- matrix(c("A", "E", "D", "C", "B", "E", "B", "E", "A", "C", "D", "E"), 3)
par(mfrow=c(2,2))
for (i in 1:4) {
selected <- is.element(species, set[,i])
boxplot(length[selected]~factor(species[selected]))
mtext("length", side=2, line=3)
}


boxplot で描くデータはデータフレームにしなくても大丈夫です。
is.element という関数で,どのケースが選ばれるかを決めて,元のデータから取り出しています。
繰り返しの部分で必要になるデータを matrix で用意しました。
繰り返しは for 文で書きました。

このようにすると,修正するときに一箇所だけ修正すればよいので,修正漏れも起こりません。

No.01703 Re: Rのplotについて  【Rはじめました】 2006/11/30(Thu) 19:14

青木先生,ありがとうございます。
目から鱗でした。大変勉強になります。

これで4つの図が描けているわけですが,ここでは,x軸,y軸のラベルはそれぞれ4つ表示されますが,これらをx軸y軸のラベルをそれぞれ1つずつにすることは可能でしょうか。

No.01705 Re: Rのplotについて  【青木繁伸】 2006/11/30(Thu) 19:19

boxplot は xlim を無視するようです(描画ルーチンへ引き渡していません)。したがって,縦軸の範囲をそろえることは,少なくとも,通常の方法では無理のようです。

また,描画エリアの左中央に文字列を入れるのも無理ですね。描画領域は1つではなく4分割されているので,それをまたいで文字を描くことができないのです。
mtext("length", side=2, line=3)
if (i == 1) mtext("length", side=2, line=3)
等とすると,左上の図にだけ軸名が描かれます。

No.01706 Re: Rのplotについて  【Rはじめました】 2006/11/30(Thu) 19:34

なるほど,分かりました。

「Rの基礎とプログラミング技法」(シュプリンガージャパン)の169 -170頁によると,プロット領域の外側にmarで設定できる作図領域があり,その外側にomaで設定できるデバイス領域があります。4分割されるのは作 図領域であり,その外側にデバイス領域がありますが,このデバイス領域に文字を入れることはできないでしょうか。

No.01707 Re: Rのplotについて  【青木繁伸】 2006/11/30(Thu) 19:52

> その外側にデバイス領域がありますが,このデバイス領域に文字を入れることはできないでしょうか

私も,そのあたりは読んでいるんですがいつも自分で使う機会がなかったので,試していないんです。

No.01708 Re: Rのplotについて  【Rはじめました】 2006/11/30(Thu) 21:11

青木先生,誠にありがとうございました。

どなたか,分かる方おられたら,アドバイスお願い致します。

No.01709 Re: Rのplotについて  【青木繁伸】 2006/11/30(Thu) 21:21

やってみました。
以下のようにすればよいようですよ。
位置などは,ちょっと試行錯誤も必要かも。
species <- c("A","B","A","C","D","E","A","B","E","A","C","B","D")
length <- c(13,20,14,18,18,13,14,17,18,14,19,20,15)
set <- matrix(c("A", "E", "D", "C", "B", "E", "B", "E", "A", "C", "D", "E"), 3)
par(mfrow=c(2,2), mar=c(2.2,2,1,1), oma=c(0,3,0,0))
for (i in 1:4) {
selected <- is.element(species, set[,i])
boxplot(length[selected]~factor(species[selected]))
}
mtext("length", side=2, line=1,outer=TRUE)

fig


No.01712 Re: Rのplotについて  【takahashi】 2006/12/01(Fri) 01:57

本題とはちょっとずれますが,参考までに。
par(xpd=NA)でクリッピング領域をデバイス領域にすることが出来ます。
par(mfrow=c(2,2),mar=rep(3,4),oma=rep(3,4))
par(xpd=F);plot(0);abline(h=0) # プロット領域
par(xpd=TRUE);plot(0);abline(h=0.5) # 作図領域
par(xpd=NA);plot(0);abline(h=0) # デバイス領域
par(xpd=NA);plot(0);abline(v=1)

fig


No.01713 Re: Rのplotについて  【takahashi】 2006/12/01(Fri) 02:16

>text( )も試しましたが,うまくいきません。text( )はデータ領域にしか挿入できないのでしょうか。
>左側の外部マージンにラベルを挿入するにはどうすればよいのでしょうか。

上のようにxpd=NAを指定すれば可能ですが,そのときのplotの座標系を用いる必要があるので面倒です。青木先生の仰るようにmtextでouter=Tにするのがいいかと。

>また,4つのplotの縦軸目盛りを統一する方法があれば,併せてご教授頂きたく,お願い致します。

縦軸を指定するのであれば,
boxplot(length[selected]~factor(species[selected]),ylim=c(0,30))
で出来ます。

No.01714 Re: Rのplotについて  【青木繁伸】 2006/12/01(Fri) 08:43

> 縦軸を指定するのであれば,
> boxplot(length[selected]~factor(species[selected]),ylim=c(0,30))
> で出来ます。

あ。昨日私は何を考えていたのか,思い出して汗が出てくる。なんと,xlim を指定していたのだった。xlim で変わるわけないですね。大失敗でした。

No.01716 Re: Rのplotについて  【Rはじめました】 2006/12/01(Fri) 09:08

青木先生,takahashiさま,
大変ありがとうございました。昨日の朝から悩み続けたモヤモヤが全て解決した上に,新たに色々勉強になりました。心より感謝致します。

No.01733 Re: Rのplotについて  【石田基広】 2006/12/02(Sat) 11:08

初めまして

「Rの基礎とプログラミング技法」(シュプリンガージャパン)の訳者です.

ご参考までに,訳本169ページのグラフィックスに関連するコードを以下に記載します.
原 著者からは,グラフィックス関連のコードをもらわなかったので,草稿の段階で私自身が Linux 上の R で試作したものです.翻訳書に掲載されているグラフィックス自体は,文字コードの関係で,Windows版 R で作成しました.その際,フォント以外にも,若干コードを変えたことがあったかも知れませんが,今,Windowsマシンが手許に無く,確認できません.


par(oma=rep(3, 4), bg="white")
plot(c(0, 1), c(0, 1), type="n", ann=FALSE, axes=FALSE)

rect(-1, -1, 2, 2, col="white")
box("figure")
par(xpd=FALSE)
rect(-1, -1, 2, 2, col="white")
box("plot", lty="dashed")
text(.5, .5, "plot region", cex = 1.6)
mtext("figure region", side=3, line=2, adj = 1, cex = 1.4)

for (i in 1:4)
mtext(paste("inner margin", i), side=i, line=1, outer= FALSE)

for (i in 1:4)
mtext(paste("outer margin", i), side=i, line=1, outer=TRUE)

mtext("device region", side=3, line=2, outer=TRUE, adj = 1, cex = 1.2)

box("outer", col="black")



どうも,お邪魔致しました.

No.01735 Re: Rのplotについて  【Rはじめました】 2006/12/03(Sun) 01:01

石田様,貴重なコードをお示しいただき,誠に有難うございました。大変参考になりました。
また,「Rの基礎とプログラミング技法」は大変便利に活用させていただいております。大変良い翻訳本を有難うございました。

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