9

xyplot軸スケールの目盛りを維持したまま、の周りのボックスを削除するにはどうすればよいですか?エドワードタフテのミニマリストデータグラフィック美学の精神では、これらの軸線は「非データインク」であり、「消去」することができます(すべきですか?)。

library(lattice)
my.df <- data.frame(x=-10:10)
my.df$y <- my.df$x^2
xyplot(y~x,data=my.df)

標準のxyplot出力

トレリス表示パラメータ(例axis.line$col)は、軸線と軸目盛りの両方を一緒に制御しているようです。

xyplot(y~x,data=my.df,
       par.settings=list(axis.line=list(col="transparent")))

axis.line $col=を使用

...これは望ましい結果ではないため、ボックスを離れるときに行をオフにする簡単な方法があるようには見えません。

私が思いついた最高のものは、ブルートフォースハックです。ここでは、次を使用して手作業で目盛りを作成しpanel.segmentsます。

at.x=pretty(c(-10,10))
at.y=pretty(c(0,100))
xyplot(y~x,data=my.df,
       par.settings=list(axis.line=list(col="transparent")),
       scales=list(x=list(at=at.x,labels=at.x),
       y=list(at=at.y,labels=at.y)),
       panel=function(...){
           panel.xyplot(...)
           panel.segments(x0=at.x,x1=at.x,y0=-4,y1=-2)
           panel.segments(x0=-11.5,x1=-11,y0=at.y,y1=at.y)
       }
       )

panel.segmentsを使用した手作りの目盛り

これは望ましい結果に近いですが、目盛りを適切な長さにし、データポイントから「適切な」距離をオフセットするには、かなりの手間がかかります。これらの値は、あるグラフィックから次のグラフィックに変換されません。さらに、軸ラベルが目盛りから離れすぎて埋め込まれていることに注意してください。そのパディングを減らす方法があると確信していますが、それではコードがさらに醜くなり、移植性が低下するだけです。

では、目盛りと軸ラベルをそのままにして、プロット領域の周りの「ボックス」を構成する線だけを抑制するにはどうすればよいでしょうか。このアプローチを使用して、すべてではなく一部の線を抑制することができる場合のボーナスポイント(たとえば、左と下の線を残し、上と右の線を抑制する)。

4

2 に答える 2

11

これはまだ少しハッキーですが、少なくとも手作業で計算する必要はありません。との組み合わせを使用し、引数を取り、次の呼び出しによって軸線の色を一時的に変更par.settingsするカスタム関数を使用します。axisline.coltrellis.par.set

編集(トレリス設定の不要な変更を削除)

xyplot(y~x,data=my.df, par.settings = list(axis.line = list(col = "transparent")),
  # Pass custom axis function to argument 'axis'
  axis = function(side, line.col = "black", ...) {
    # Only draw axes on the left and bottom
    if(side %in% c("left","bottom")) {
      # Call default axis drawing function
      axis.default(side = side, line.col = "black", ...)
    }
  }
)

現時点でline.col = "black"は、カスタム軸関数の引数に魔法が必要な理由を説明します。私の推測では、それは楕円()との引数の一致に関係していると思います...。おそらく明日はもっと賢くなり、本当の理由を見つけるでしょう。

これにより、次のようになります。

ここに画像の説明を入力してください

于 2012-10-15T19:43:34.637 に答える
-2

最も簡単な方法は、カスタム軸関数(axis)を使用することです。lwd(線幅)をゼロに設定し、目盛り(lwd.ticks)を別の値に設定するだけです。それは魅力のように機能しました!

plot(NA,NA,type="n",xaxt="n", lwd=linewidth, xlim=c(1,24), xlab="", ylab="",ylim=c(-300,500))
axis(side = 4, tck = .05, **lwd=0, lwd.ticks=1**, line = 0, labels = NA, col= cols_border[1], col.axis = cols_black)
axis(side = 4, lwd = 0, line = -4.5, las = 1, cex.axis=axis_fontsize, col= cols_border[1], col.axis = cols_black)
mtext("Light deviations (lum/sec)",side=4, padj=-2.5, cex=title_fontsize, col="black")
于 2013-09-03T05:22:42.370 に答える