2016-11-16 16 views
0

visregパッケージとvisreg2d()関数を使用して、2つのgbmモデル変数間の相互作用を示す3D部分依存グラフを作成しています。ジャーナル記事の素敵なプロットを作るためにx、y、z軸のラベルと間隔を変更する必要があります。 par()で設定を変更しようとしましたが、ラベルサイズを変更することしかできません。gbmモデル結果の3D部分プロットのスペーシングと軸ラベルの変更 - visregパッケージ

visreg2d(final,n.trees=1000,xvar="ProbMn50ppb",yvar="DTW60Jurgens",plot.type="persp",type="conditional", 
     theta=140,phi=40) 

「最終」私のモデルオブジェクトである:

私は次のようでプロットを生成しています。

axes=FALSEvisreg2d()コマンドで設定すると、軸を削除できます。だから私は解決策はカスタムの間隔でカスタムラベルを作成することができると推測しています。 xlab=, ylab= zlab=でラベルを変更することもできます。しかし、別の問題は、私が必要とするzラベルの式を使用できないことです。ここで

は私のプロットは、現在のラベルや軸を持つように見えるものです: enter image description here

答えて

1

visreg2d(plot.type = "persp")は、グラフを作るためにpersp()を使用しています。正しく覚えていればpersp()expression()をラベルとして使用できないため、ラベルを移動するオプションはありません((改行)を使って大まかに移動できます)。xlab="\nx-label"などです。したがって、text()を使用して手動で行う必要があります。それを行うには、2つの値、テキストの角度と中心座標が必要です。過去に私はこれらの値を計算する関数を作った(私はR mailing helpを参照していた)、私はそれを示します。

# top/bot are coordinates(x,y,z) of the axis; pmat is output of persp() 
# pos means the label is c(left(-1) or right(1), down(-1) or up(1)) of the axis 

persp_lab_f <- function(top, bot, pmat, space, pos = c(-1, -1)) 
{ 
    coords_3d <- list(top = top, bot = bot) 
    coords_2d <- lapply(coords_3d, function(v, pmat) unlist(trans3d(v[1], v[2], v[3], pmat)), pmat = pmat) 
    coords_2d$mid <- (coords_2d$top + coords_2d$bot)/2 # mid is calculated from 2d-coordinates 
    # coords_2d$mid <- unlist(trans3d(((top + bot)/2)[1], ((top + bot)/2)[2], ((top + bot)/2)[3], pmat)) if use mid in 3d-coordinates 
    tb_diff <- coords_2d$top - coords_2d$bot 
    angle <- 180/pi * atan2(tb_diff[2], tb_diff[1]) 
    names(angle) <- "angle" 
    center <- coords_2d$mid + sqrt(space^2/sum(tb_diff^2)) * rev(abs(tb_diff)) * pos 
    out <- list(angle = angle, center = as.data.frame(t(center))) 
    return(out) 
} 

reproducible exampleを表示していないので、次回提供します。

fit <- lm(Ozone ~ Solar.R + Wind + Temp + I(Wind^2) + I(Temp^2) + 
      I(Wind*Temp)+I(Wind*Temp^2) + I(Temp*Wind^2) + I(Temp^2*Wind^2), 
      data=airquality) 

vis_d <- visreg2d(fit, xvar = "Wind", yvar = "Temp", plot.type="persp", type="conditional", theta = 140, phi = 40) 

x <- vis_d$x 
y <- vis_d$y 
z <- vis_d$z 

x_top <- c(max(x), max(y), min(z)) 
x_bot <- c(min(x), max(y), min(z)) 
y_top <- c(max(x), max(y), min(z)) 
y_bot <- c(max(x), min(y), min(z)) 
z_top <- c(max(x), min(y), max(z)) 
z_bot <- c(max(x), min(y), min(z)) 

pmat <- persp(x, y, z, theta = 140, phi = 40) 

xlab_param <- persp_lab_f(x_top, x_bot, pmat, 0.1, pos = c(1, -1)) 
ylab_param <- persp_lab_f(y_top, y_bot, pmat, 0.1) 
zlab_param <- persp_lab_f(z_top, z_bot, pmat, 0.1) 

par(mar=c(1,1,1,1)) 
visreg2d(fit, xvar = "Wind", yvar = "Temp", plot.type="persp", type="conditional", theta = 140, phi = 40, 
     xlab = "", ylab = "", zlab = "") 

text(xlab_param$center, srt = xlab_param$angle + 180, "xxxxxxxxxx") 
text(ylab_param$center, srt = ylab_param$angle, "yyyyyyyyyy") 
text(zlab_param$center, srt = zlab_param$angle + 180, labels = bquote(Sigma ~ .("zzzzzzzzzz"))) 

enter image description here

+0

これは素晴らしい仕事、ありがとう!理想的には、私は2つの並列プロットを作って、 '' par(mfrow = c(1,2)) ''を使っています。ただし、z軸ラベルは切り取られています。私は '' mai''と '' mar''の値を変更しようとしましたが、実際には外側マージンの面積が増えるようです。関数の呼び出しの設定を0.1から大きな値に変更すると、テキストがプロットの外に移動します。何か案は?もしそれが役に立つとすれば、2番目の答えの中にサンプルプロットを貼り付けることができます。 – user29609

+1

@ user29609; 'xpd = T'は問題を解決します。たとえば、' par(mar = c(1,3,1,1)); visreg2d(...);テキスト(...、xpd = T) ' – cuttlefish44

+0

それはうまくいきました、ありがとうございます! – user29609

関連する問題