No.16277 Rの棒グラフと折れ線の描画について  【波音】 2012/01/26(Thu) 13:21

以前にRで棒グラフと折れ線を描く方法について質問させて頂いてました。
 http://aoki2.si.gunma-u.ac.jp/lecture/mb-arc/arc039/01537.html

棒グラフに追加でpoints()を使って折れ線を書く場合,x軸の値を適切に取得して指定しないと変なところにデータポイントが打たれてしまいます。過去に頂いた回答だと

 「1〜カテゴリー数の倍数になっている」

ということで,例示したデータだと

 points(1:9*3-1, x,ylim=c(0,140000), pch=20, cex=2, col= color3)

となっていました。この 1:9*3-1 の部分において, *3-1 という部分(1:9はカテゴリ数)はどうやって分かるのでしょうか?

例えばカテゴリ数が2の場合,15の場合,21の場合などはどうなるのでしょうか。。。

何か倍数部分の数値を得る方法があるのでしょうか?(それとも試行錯誤で見つけるしかないのでしょうか)

No.16278 Re: Rの棒グラフと折れ線の描画について  【青木繁伸】 2012/01/26(Thu) 21:15

あのときのコメントは,バーグラフの個数が 2 という特定のときについてのものでしたね。
一般的にバーグラフの個数が k のときのマークの x 座標値は i * (k+1) - k/2 ではないかと思います。

特 定の k のときの x 座標は,locator 関数を使って,マークを描画すべき x 座標を得て(当然小数点の付いた数値になりますが,それは 0.5 単位の数値に近い数値になっていると思われます),バーグラフの個数との一般式を推定してプログラムに用いれば宜しいかと思います。

No.16290 Re: Rの棒グラフと折れ線の描画について  【波音】 2012/01/28(Sat) 01:24

回答ありがとうございます。

今し方,小手調べで得た情報ですが(多少,力技ですが)棒グラフに重ねて折れ線を描く場合:

#### 水準数に応じたx軸の座標を返す関数
x.value <- function(x) 1.1984*x - 0.5149

でx軸の座標値を得られるみたいです(これは棒グラフの棒が1個のとき)。

#### 出力サンプル
# 例えば0:37(38カテゴリ)でも自動的にx軸を取得して折れ線を描ける
tbl <- table(sample(0:37, 300, replace=TRUE))
barplot(tbl)
x.jiku <- x.value(1:length(names(tbl)))
points(x.jiku, tbl, col="red", type="b")

No.16294 Re: Rの棒グラフと折れ線の描画について  【青木繁伸】 2012/01/29(Sun) 08:27

graphics:::barplot.default でプログラムを見ると,space のデフォルトは 0.2 で,棒の幅は1であることがわかり,i 番目(i=1,2,...)の棒の 左辺の座標は (i-1)*1.2+0.2,右辺の座標は i*1.2 であり,中点は i*1.2-0.5 であることが分かります。
x.value <- function(x) 1.2*x - 0.5
ですね。

No.16295 Re: Rの棒グラフと折れ線の描画について  【波音】 2012/01/29(Sun) 20:28

ありがとうございます。barplotのソースコードでspaceに代入されている部分をみれば正確なプロットの間隔を確認できたわけですね。

私はlocator関数でカテゴリ数が1〜20までの棒グラフを作成して1つ1つ座標軸を取得して,回帰して定数項と係数の部分を得ていました(^_^;)

No.16336 Re: Rの棒グラフと折れ線の描画について  【波音】 2012/02/04(Sat) 03:20

最終的には添付図のようなグラフを描きたいのですが。。。

barplot()やplot()で描かれる棒グラフの横軸の値を取得できたは良いものの,また新たな問題が出てきてしまいました(泣)

例えば以下のようにして

y <- as.factor(rep(c(0, 1), c(40, 50)))
plot(y)
prb <- c(0.3, 0.5)
par(new=TRUE)
x.value <- function(x) 1.2*x - 0.5
plot(x.value(1:length(prb)), prb, ylim=c(0, 1), ann=FALSE, axes=FALSE, las=1)

棒グラフに比率の折れ線を重ね描きしたいのですが,par(new=TRUE)として2回目にplot()を使ったときに横軸の位置(棒グラフの真ん中の位置)が変わってしまいます。

locator()で確認してみると,par(new=TRUE)とした時点では

 0.6872666 1.8931549

となっているのですが,2回目のplot()を使った後で同じくX軸座標の値を取得すると

 0.9657818 1.6186847

となってしまっています。。。

何かうまい方法はないでしょうか?


No.16337 Re: Rの棒グラフと折れ線の描画について  【青木繁伸】 2012/02/04(Sat) 08:49

図を書き足すときに par(new=TRUE) を使わないことです。
plot, barplot などの高水準描画関数の後は,lines, points など低水準描画関数を使います。また,今回の例のような場合には,第2の縦軸を用意します。第1軸の目盛りにあうようにプロット値を変換して描画し,軸目 盛りには,変換前の目盛りを振ります。
y <- as.factor(rep(c(0, 1), c(40, 50)))
plot(y, col=4)
prb <- c(0.3, 0.5)
#par(new=TRUE)
x.value <- function(x) 1.2*x - 0.5
points(x.value(1:length(prb)), prb*50, pch=15, col=2)
lines(x.value(1:length(prb)), prb*50, col=2)
axis(4, at=0:5*25, labels=0:5*0.5)


No.16342 Re: Rの棒グラフと折れ線の描画について  【青木繁伸】 2012/02/04(Sat) 17:17

barplot のヘルプを見ていたら,barplot は,棒の中点(x座標)を返すと書いてありました。
ヘルプはよく読むべきだなあと改めて思い知らされました。

Value

A numeric vector (or matrix, when beside = TRUE), say mp, giving the coordinates of all the bar midpoints drawn, useful for adding to the graph.

If beside is true, use colMeans(mp) for the midpoints of each group of bars, see example.

No.16357 Re: Rの棒グラフと折れ線の描画について  【波音】 2012/02/05(Sun) 22:05

毎度の返信ありがとうございます。

ホ,ホントですね。。。

今やってみたら確かに barplot()はx軸の座標(つまり棒の真ん中の値)を返してくれました。そういえば,ヒストグラムを描くhist()も $mid として,棒の中 心座標をオブジェクトとして返していますから,barplot()も同じようなことがないのかと検討をつけてみるべきでした。

まずはヘルプをよく見るということを私も再認識いたします。

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