No.02633 Rのplot:軸のブレイク  【Rはじめました】 2007/02/07(Wed) 16:20

Rでグラフを描いたときに,y軸を分割することは可能でしょうか。ちょっとうまく説明できませんが,例えば,多くのデータ の値が,0から40の間にあり,飛び値が90付近にあるようなときに,0〜100の目盛があるy軸を40から80までを表示せずにその間を圧縮して表示す るということができないかということです。デルタグラフというソフトでは,軸のブレイクという機能で可能ですが,Rではできるでしょうか。40〜80を表 示しないだけならば,
axis(2, at=0:40)
axis(2, at=80:100)
で,できますが,これだと40と80の間が開いてしまいます。ここの間隔を自在に設定する方法は無いでしょうか。もちろん軸とともに,グラフの部分も圧縮する必要があります。
色々調べてみましたが,行き当たらないので,質問させて頂きます。

No.02634 Re: Rのplot:軸のブレイク  【あら】 2007/02/07(Wed) 16:32

plotrxパッケージのaxis.breakはどうでしょうか。
URLを参考にして下さい。
http://bg9.imslab.co.jp/Rhelp/R-2.4.0/src/library/plotrix/man/axis.break.html

No.02636 Re: Rのplot:軸のブレイク  【Rはじめました】 2007/02/07(Wed) 19:01

あら様,早速のご助言ありがとうございます。
例として出ているようにやってみましたが, axis.breakでは,軸はブレイクできますが,ブレイクしたところを詰める(圧縮する)ことができません。何か方法があるに違いないとは思うのです が,分かりません。また,gap.plotでは,gap=c(40,80)のようにして範囲を詰めることができるようですが,2つのグラフボックスとなっ てしまいます。後者のようなデータ範囲を前者のようなstyleで表示することはできないのでしょうか。引き続き自分でも検討してみますが,ご助言頂けれ ば幸いです。

No.02637 Re: Rのplot:軸のブレイク  【あら】 2007/02/07(Wed) 19:33

どうやらお役に立てなかったようです。
自分でしたらグラフをPDFあるいはEPS形式で書き出してからIllustratorで加工します。

メタファイル形式で書き出してOpenOfficeのDrawに取り込めば同じようにできるのでしょうが,文字が汚くなって後ですべて入力し直さないといけないのでIllustratorを使います。

邪道な方法かもしれませんが,論文用の図はRだけではうまくいかないのでこの様にしています。

No.02638 Re: Rのplot:軸のブレイク  【takahashi】 2007/02/07(Wed) 19:43

gap.plotに少し手を加えれば出来ます。
長いので途中省略しますが,
bad.gap.plot<-function (x, y, gap, gap.axis = "y", xaxlab, xtics = NA, yaxlab, 
ytics = NA, col = par("col"), xlim, ylim, axes = FALSE, style = "gap", ...) #style = "gap" を追加
{
## 40行ほど省略
box()
if (gap.axis == "y") {
if (!is.na(xtics[1]))
axis(1, at = xtics, labels = xaxlab)
littletics <- which(ytics < gap[1])
bigtics <- which(ytics >= gap[2])
axis(2, at = c(ytics[littletics], ytics[bigtics] - gapsize),
labels = c(yaxlab[littletics], yaxlab[bigtics]))
axis.break(2, gap[1], style = style) # style=style に変更
points(x[bigones], y[bigones] - gapsize, col = col[bigones])
}
else {
if (!is.na(ytics[1]))
axis(2, at = ytics, labels = yaxlab)
littletics <- which(xtics < gap[1])
bigtics <- which(xtics >= gap[2])
axis(1, at = c(xtics[littletics], xtics[bigtics] - gapsize),
labels = c(xaxlab[littletics], xaxlab[bigtics]))
axis.break(1, gap[1], style = style) # style=style に変更
points(x[bigones] - gapsize, y[bigones], col = col[bigones],
...)
}
}

set.seed(1)
x<-runif(100)
y<-c(runif(95)*40,runif(5)*10+90)
bad.gap.plot(x,y,gap=c(40,90),style="slash")
ただ,このようなオプションがデフォルトでは存在しないことの意味を考える必要はあると思います。

No.02639 Re: Rのplot:軸のブレイク  【Rはじめました】 2007/02/07(Wed) 19:59

ありがとうございました。非常に複雑で難しく,私の今のレベルを超えているようです。
このようなオプションがデフォルトで存在しないということは,あまり意味のない作業というか描画なのでしょうかね。
takahashi様に記述頂いたプログラムについては,勉強させて頂くとして,
当該作図についても考え直してみます。誠にありがとうございました。

No.02640 Re: Rのplot:軸のブレイク  【takahashi】 2007/02/07(Wed) 20:10

簡単にやるなら,

> bad.gap.plot<-edit(gap.plot)

とすると関数のエディット画面が出てくるので,その中でNo.2638の変更点を変更して,
閉じる。
で,No.2638のようにbad.gap.plotを呼び出せばできます。


意味がないならまだいいですが,多くの場合,この手のプロットは有害と考えられていると思います。

No.02641 Re: Rのplot:軸のブレイク  【青木繁伸】 2007/02/07(Wed) 21:01

そろそろ決着が付いたのかも知れませんが,2636の
> axis.breakでは,軸はブレイクできますが,ブレイクしたところを詰める(圧縮する)ことができません。
というのが分かりません。

2639の
> 意味がないならまだいいですが,多くの場合,この手のプロットは有害と考えられていると思います。

の意味は大きいと思います。

個別のグラフを要望通り描くのは簡単(?)にもできますが,汎用性があるのかと言うことと,2639のような意見によれば,例を呈示するのもためらわれるとか。。。(^_^;)

No.02645 Re: Rのplot:軸のブレイク  【takahashi】 2007/02/07(Wed) 23:22

最近こっそりと話題になっていることとして,

http://takagi-hiromitsu.jp/diary/20070128.html#p01
http://takagi-hiromitsu.jp/diary/20070204.html#p01

なんて話があります。

私自身は特定の何かを批判する気持ちはあまりないですが,
テレビを見ていると,よく感じることです。
上の話は棒グラフがメインですが,どんなグラフでも間を抜けば混乱するでしょう。

グラフは,正しく使えばデータの本質が一目でわかるのが利点ではあるけど,
使い方を(意図はさておき)間違えると,容易に誤解を与えるということですね。

No.02646 Re: Rのplot:軸のブレイク  【青木繁伸】 2007/02/08(Thu) 13:18

ある電池のパッケージ裏の印刷です。
こういうのは,「嘘・大げさ・まぎらわしい」でおなじみの,JAROに報告した方がいいのだろうか。

fig


No.02647 Re: Rのplot:軸のブレイク  【takahashi】 2007/02/08(Thu) 13:35

グラフは「大げさ」,

>130%UP
というのは「嘘」ですね。
従来品は100%UPと考えればいいのかな?

こういうのは,「大体これくらいの範囲だと疑われもしないし効果があるように思われそう」みたいな事前知識があって,それに数字をあわせてるんじゃないでしょうか?

No.02648 Re: Rのplot:軸のブレイク  【あら】 2007/02/08(Thu) 13:44

性能が正しいと仮定しても
「30%UP」でないと間違いのような気がしますが。

No.02659 Re: Rのplot:軸のブレイク  【Rはじめました】 2007/02/08(Thu) 21:28

皆様,たくさんのコメント有難うございます。データの表現には気をつけなくてはならないといけないということが良く分かりました。
実は,次のような状況があり,軸ブレイクを使えないものかと思案しておりました。
以 前No.2425で質問させていただいたように,複数のグラフを縦横に並べて描画するときに,比較しやすいようにy軸をできるだけ同じスケールにしたいの ですが,ほとんどのグラフではy軸値が0-30の間に収まるのですが,ひとつのグラフで飛び値が90とかになっている場合です。全体を眺めるために全ての グラフのy軸を0:100等とするのも可能ですが,それでは,大多数のデータは0:30の間にあるので,各グラフ中の上7割は空白になるし,見にくくなり ます。そこで,飛び値のある唯一のグラフ以外のy軸は0:30とし,飛び値のグラフの軸にブレイクを入れようとした次第です。この場合,飛び値のグラフの スケールを0:100とし,それ以外のスケールを0:30とするようなことをしたほうが良いのでしょうか。
どのようにするのが一番適切なのか,ご意見いただければと思います。宜しくお願いいたします。

No.02660 Re: Rのplot:軸のブレイク  【青木繁伸】 2007/02/08(Thu) 21:33

一つのグラフだけで,外れ値が1個なら,グラフにはその外れ値をプロットせずに,図中に「○○という外れ値がある」と注記しておけば良いのでは?

もちろん,外れ値となった理由を突き止めれば,その外れ値を除外できるかもしれません。
というか,外れ値となった理由を突き止めるのが必須かな?

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