No.13045 重複している座標のcexを制御する方法  【波音】 2010/07/13(Tue) 23:40

> x <- c(1, 1, 2, 3, 1, 4, 5)
> y <- c(1, 2, 2, 4, 2, 5, 5)
> plot(x, y)

と して描かれる散布図において,(x2, y2) = (1, 2)と(x5, y5) = (1, 2)といったように散布図のデータポイントが重複している部分(つまり重ねて描かれている部分)があります。この部分のみの(plotの引数であ る)cexの値を変える工夫などできますでしょうか?

例えば,この場合だと2回重複しているので座標(1, 2)に描かれるデータポイントの大きさだけcex=2にしたいのです。

欲をいうと,最終的には:

plot(x, y, xlim=c(-1, 5), ylim=c(-1, 5))
abline(h=0, v=0, lty=3)
for(i in 1:length(x)) arrows(0, 0, x[i], y[i])

として描かれる矢印で,座標(1, 2)に向かう矢印の太さをlwd=2などとしたいのです。矢印の太さで,(矢印の)終点の座標が重複している数がたくさんあることを表現したいのですが・・・

No.13047 Re: 重複している座標のcexを制御する方法  【青木繁伸】 2010/07/14(Wed) 10:02

泥臭い方法ですが,以下のようにしても実行時間は無視できる程度です。
データが小数点付きの場合でもかまいません。矢印表示の場合は,標本サイズが大きくなると見にくくなりますね。
なお,散布図の場合には,円の面積が度数に比例するようにした方がよいですね。
x <- c(17, 16, 21, 21, 17, 14, 18, 15, 23, 19, 21, 14, 20, 21, 15, 
28, 22, 23, 19, 19, 23, 22, 20, 30, 26, 20, 14, 20, 21, 20, 16,
23, 29, 6, 16, 21, 16, 14, 18, 22, 22, 24, 20, 11, 20, 27, 26,
18, 16, 27, 23, 26, 19, 20, 16, 17, 18, 28, 30, 25, 23, 23, 19,
17, 25, 16, 15, 28, 7, 26, 16, 20, 21, 20, 20, 10, 25, 28, 18,
11, 18, 21, 19, 26, 30, 26, 18, 20, 20, 16, 24, 18, 22, 16, 10,
22, 27, 15, 22, 13)
y <- c(19, 18, 11, 21, 15, 19, 19, 12, 15, 14, 19, 18, 11, 13, 20,
13, 8, 15, 15, 16, 13, 9, 15, 8, 14, 12, 20, 14, 21, 13, 10,
15, 3, 24, 16, 20, 16, 14, 13, 21, 15, 12, 16, 17, 17, 11, 13,
12, 15, 8, 18, 16, 13, 14, 15, 18, 16, 14, 15, 15, 11, 15, 15,
17, 6, 18, 13, 7, 24, 14, 19, 14, 15, 19, 20, 14, 14, 13, 18,
23, 10, 14, 17, 8, 9, 14, 16, 20, 15, 15, 14, 16, 18, 20, 20,
13, 9, 14, 13, 22)
tbl <- table(x, y)
nx <- nrow(tbl)
ny <- ncol(tbl)
vx <- as.numeric(rownames(tbl))
vy <- as.numeric(colnames(tbl))
layout(matrix(1:2, 1))
plot(c(0, max(x)), c(0, max(y)), type="n", xlab="x", ylab="y")
for (i in 1:nx) {
for (j in 1:ny) {
if (tbl[i, j] > 0) points(vx[i], vy[j], cex=sqrt(tbl[i, j]))
}
}
plot(c(0, max(x)), c(0, max(y)), type="n", xlab="x", ylab="y")
for (i in 1:nx) {
for (j in 1:ny) {
if (tbl[i, j] > 0) arrows(0, 0, vx[i], vy[j], lwd=tbl[i, j])
}
}

layout(1)


No.13050 Re: 重複している座標のcexを制御する方法  【波音】 2010/07/14(Wed) 15:08

早速の回答ありがとうございました!!

table()で集計して,その行ラベルと列ラベルをas.numeric()でnumeric型に変換したものを利用するのですね。あとは二重ループで順々に大きさを割り当てて描いていく,と。

元々,たくさんのデータを対象としていないので実行時間については問題にならなそうです(^_^;) とはいえ,大きさ(太さ)を少し工夫しないと見難いだけの図になりかねないので,気をつける必要がありそうです。

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