【问题标题】:Controlling axis ticks and axis lines separately on R lattice xyplot在 R lattice xyplot 上分别控制轴刻度和轴线
【发布时间】:2012-10-05 18:25:27
【问题描述】:

如何在保留轴刻度刻度线的同时删除 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)

似乎格子显示参数(例如axis.line$col)同时控制轴线和轴刻度:

xyplot(y~x,data=my.df,
       par.settings=list(axis.line=list(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)
       }
       )

这接近于预期的结果,但是要使刻度线的长度合理并从数据点偏移“不错”的距离,需要进行大量的调整。这些值不会从一个图形转换为下一个图形。另外,请注意轴标签现在距离刻度线太远了。我确信有一种方法可以减少填充,但这只会使代码更难看,更不便携。

那么,如何才能只抑制构成绘图区域周围“框”的线条,同时保持刻度线和轴标签完好无损呢?如果这种方法也可用于抑制部分而非全部线条(例如,保留左侧和下部线条,但抑制顶部和右侧线条),则可加分。

【问题讨论】:

    标签: r axis lattice


    【解决方案1】:

    这仍然有点老套,但至少您不必手动进行任何计算。它使用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" 来魔术。我的猜测是它与与省略号 (...) 匹配的参数有关。也许明天我会更聪明,找到真正的原因。

    这会导致:

    【讨论】:

    • 这看起来很棒。您是否介意提供一些关于轴功能的每一行的作用以及您为什么这样做的评论?我正在查找有关低级轴功能的帮助文档(例如 axis.default 不是很有启发性。
    • @mac,原来有一些不必要的网格选项更改,真正的技巧似乎是为自定义轴函数提供一个正式参数line.col
    • 不错。 FWIW,line.col = "black" 是必需的,因为默认情况下 panel.axis() 的线条颜色来自 trellis.par.get("axis.line"),您之前已将其设置为 "transparent"
    【解决方案2】:

    最简单的方法就是使用自定义坐标轴功能(axis)。只需将 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")
    

    【讨论】:

    • 这使用基本图形,而 OP 使用 lattice 包。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-10-15
    • 1970-01-01
    • 1970-01-01
    • 2016-06-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多