2012-10-15 11 views
9

xyplotの周りのボックスを削除するにはどうすればよいでしょうか? Edward Tufteのミニマリストデータグラフィックの精神では、これらの軸線は「非データインク」であり、「消去」する必要があります。R格子xyplot上で軸ティックと軸線を別々に制御

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

standard xyplot output

一緒ティックトレリス表示パラメータ(例えばaxis.line$col)が軸線や軸の両方を制御しているようです:

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

with axis.line$col="transparent"

...です希望の結果ではないので、ボックスを出ている間にラインをオフにする簡単な方法がないように見えます。

私が思い付くことができました最高のは、私が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) 
     } 
     ) 

hand-made tick marks with panel.segments

これが近くにあります目立った結果が得られますが、チックマークを合理的な長さにし、データポイントから「いい」距離を相殺するためにはかなりの手間がかかります。これらの値は1つの図形から次の図形に変換されません。さらに、軸ラベルが目盛りからあまりにも遠くにパディングされていることに注意してください。私はそのパディングを減らす方法があると確信していますが、それだけでコードが醜くて移植性が低くなります。

したがって、ティックマークと軸ラベルをそのまま残したまま、プロット領域の周りの "ボックス"を構成する線を抑制することはできますか?このアプローチを使用して、ラインのすべてではなく一部を抑制することができる場合(例えば、左と下のラインを残すが、上と下のラインは抑止する)、ボーナスポイント。

答えて

10

これはまだちょっとハッキリですが、少なくとも手作業で行う必要はありません。それはpar.settingsの組み合わせ引数line.colを受け取り、一時的trellis.par.setへの呼び出しによって軸線の色を変更するカスタムaxis関数を使用:

EDIT(トレリス設定の除去不要変更)

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"がマジックへのカスタム軸機能の引数に必要なのかをチョークします。私の推測では、それは省略記号(...)と一致する引数と関係があるということです。おそらく私は明日明日になり、本当の理由を見つけるでしょう。

これは、その結果:

enter image description here

+0

これは素晴らしいです。軸機能の各ラインが何をしているのか、なぜそれをやっているのかを少し解説しておきますか?私は、低レベルの軸関数(例えば 'axis.default'のようなヘルプドキュメントはあまり啓発されていません)のヘルプドキュメントを探しています。 – mac

+0

@mac、トレリスオプションの不要な変更がありました。 – BenBarnes

+1

Nice.FuWW、 'line.col =" black "'は 'panel.axis()'がデフォルトで 'trellis.par 'からの線の色をとるため、' line.col = "black" 'が必要です。 –

-1

一番簡単な方法は、カスタム軸機能(軸)を使用することです。 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") 
+0

これはベースグラフィックスを使用していますが、OPは 'lattice'パッケージを使用しています。これは以前の' 'transparent ''に設定したget( "axis.line") ' – BenBarnes

関連する問題