在R晶格xyplot上分别控制轴刻度线和轴线

时间:2012-10-15 18:03:54

标签: r axis lattice

如何在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)

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

这接近于期望的结果,但是需要相当多的摆弄才能使刻度标记成为合理的长度并且偏离数据点的“漂亮”距离。这些值不会从一个图形转换为下一个图形。另外,请注意轴标签现在填充距刻度线太远。我确信有一种方法可以减少填充,但这只会使代码更加丑陋且便于携带。

那么怎样才能抑制构成绘图区周围“框”的线条,同时保留刻度线和轴标签的完整性?如果这种方法也可以用于抑制一些但不是所有的线(例如,留下左线和下线,但是抑制顶线和右线),则可以获得奖励积分。

2 个答案:

答案 0 :(得分:11)

这仍然有点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"为魔术。我的猜测是它与椭圆(...)的参数匹配有关。也许明天我会更明智,找到真正的理由。

这导致:

enter image description here

答案 1 :(得分:-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")