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

mac*_*mac 9 axis r 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)
Run Code Online (Sandbox Code Playgroud)

标准xyplot输出

似乎格子显示参数(例如axis.line$col)控制轴线和轴标记在一起:

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

与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)
       }
       )
Run Code Online (Sandbox Code Playgroud)

用panel.segments手工制作的刻度线

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

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

Ben*_*nes 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", ...)
    }
  }
)
Run Code Online (Sandbox Code Playgroud)

目前,我总结了为什么line.col = "black"自定义轴函数的参数需要魔术.我的猜测是它与椭圆(...)的参数匹配有关.也许明天我会更聪明,找到真正的理由.

这导致:

在此输入图像描述