2012-10-15 175 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

這是接近期望的結果,但是需要相當多的小竅門才能使刻度線成爲合理的長度並且抵消與數據點「良好」的距離。這些值不會從一個圖形轉換到另一個圖形。另外請注意,軸標籤現在被填充得離刻度線太遠。我確信有一種方法可以減少這種填充,但這隻會使代碼變得更加醜陋,不便於攜帶。

那麼怎樣才能抑制構成繪圖區周圍「盒子」的線條,同時保留刻度標記和軸標籤?獎勵點數,如果這種方法也可以用來抑制一些線條,但不是全部線條(例如離開左邊和下邊線,但是抑制頂線和右邊線)。

回答

10

這仍然有點冒失,但至少你不必親自去做任何事情。它採用的par.settings的組合和定製axis函數,它的參數line.col和臨時改變由呼叫軸線顏色trellis.par.set

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,結果發現有一些不必要的網格選項變化,真正的技巧似乎是提供自定義軸函數'line.col'的正式參數 – BenBarnes

+1

Nice,FWIW,'line.col =「black」'是需要的,因爲'panel.axis()'默認從'trellis.par獲取它的線顏色。 get(「axis.line」)',你之前已經設置爲''transparent''。 –

-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'包。 – BenBarnes