簡體   English   中英

在R晶格xyplot上分別控制軸刻度線和軸線

[英]Controlling axis ticks and axis lines separately on R lattice xyplot

如何在保留軸刻度刻度線的同時去除xyplot周圍的xyplot 根據Edward Tufte的極簡主義數據圖形審美精神,這些軸線是“非數據墨水”,可以(應該?)“擦除”。

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手工制作的刻度線

這接近於期望的結果,但是需要相當多的擺弄才能使刻度標記成為合理的長度並且偏離數據點的“漂亮”距離。 這些值不會從一個圖形轉換為下一個圖形。 另外,請注意軸標簽現在填充距刻度線太遠。 我確信有一種方法可以減少填充,但這只會使代碼更加丑陋且便於攜帶。

那么怎樣才能抑制構成繪圖區域周圍“框”的線條,同時保留刻度線和軸標簽的完整性? 如果這種方法也可用於抑制一些但不是所有的線(例如,留下左線和下線,但抑制頂線和右線),則可獲得獎勵積分。

這仍然有點hacky,但至少你不需要手工做任何事情。 它使用par.settings和自定義axis函數的組合,該函數采用參數line.col並通過調用trellis.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"才能使用魔法。 我的猜測是它與橢圓( ... )的參數匹配有關。 也許明天我會更聰明,找到真正的理由。

這導致:

在此輸入圖像描述

最簡單的方法是使用自定義軸功能(軸)。 只需將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")

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM