web-dev-qa-db-ja.com

散布図にx = y線を追加

Carパッケージのscatterplot関数を使用して、scatterplotを生成しています。 x = yとなるはずの参照線をプロットに生成したい。私はablineを使ってみましたが、それは行を追加しますが、x = y行ではありません。誰かがお手伝いできますか?

私のコードは次のとおりです:

scatterplot(phenos$P1~pheno$P0, data=pheno,spread=FALSE,ylab="6 month timepoint", xlab="Baseline Timepoint", jitter=list(x=1, y=1))
abline(0,1)

ありがとう。

11
CadisEtRama

scatterplot()は内部でlayoutを使用するため、これは実際にはかなり難しい/やりがいがあります。これにより、グラフィックスドライバーが現在使用しているサブプロットを制御することが難しくなります。 (更新:思ったより難しい-par("mfg")の設定は多かれ少なかれ偶然に働いていたに違いありません。)

データを構成する(pdate:平均xとyがゼロではなく、互いに等しくないデータを使用します。これは、abline()を単純に使用する難しさをより明確に示すためです)

_set.seed(1)
d <- data.frame(x=rnorm(10,mean=10),y=rnorm(10,mean=12))
library(car)
_

私の古い戦略を試してください(これは実際には機能しないか、予測不能にしか機能しません)。

_scatterplot(y~x,data=d,reset.par=FALSE)
k <- 1              
for (i in 1:2) {
   for (j in 1:2) {
      par(mfg=c(i,j,2,2))
        abline(0,1,lwd=3,col=k)
        k <- k+1
  }
_

}

これをどのように行うかに応じて、警告とエラーを受け取るか、偽の回答を受け取ります。関数内でscatterplot()を呼び出すかどうかは問題のようです... ??

enter image description here

2番目の試み、より保守的に:レイアウトを最初から再構築します。

_ scatterplot(y~x,data=d)
 uu <- par("usr")
 ## mimic layout frolm car:::scatterplot.default.  Would be different if we were drawing only one
 ## of x-boxes or y-boxes
 layout(matrix(c(1, 0, 3, 2), 2, 2), widths = c(5, 95), 
        heights = c(95, 5))
 oldmar <- par(mar=rep(0,4))  ## zero out margins so we can plot in sub-boxes without errors
 ## now skip through the first two sub-plots
 par(new=TRUE); plot.new(); par(new=TRUE); plot.new()
 par(oldmar)  ## reset margins
 ## blank plot with user limits set and 'interior' axis calculations
 plot(0:1,0:1,xlab="",ylab="",xlim=uu[1:2],ylim=uu[3:4],xaxs="i",yaxs="i")
 ## add annotation
 abline(a=0,b=1,col=4,lwd=3)              
_

enter image description here

このソリューションの労力と脆弱性を考えると、実際にscatterplotをハックして、オプションでabline()を追加で指定できるようにするか、メンテナにその機能を要求することが最善です...

1
Ben Bolker

同じ関数ablineで目標を達成できます。関数abline(a=0, b=1)を使用します。ここで、abは、それぞれラインの切片と傾斜です。これにより、Y = a + b*xという形式の直線が描画されます。

お役に立てれば。

私は、segments関数を使用します。segments(x0 = 0、y0 = 0、x1 = 45、y1 = 45)

Yの値をプロットの限界をちょうど上回らせるだけです。

この関数は、xとyの制限を変更しないため、ニースでもあり、xとyの値を正確に選択する必要なく、グラフ全体で線をきれいに実行できます。

3
Denys Kelly