如何在 R 中编辑 Tukey 测试图

Emi*_*ily 3 plot r axis-labels tukey

我对方差分析进行了事后 Tukey 检验,然后绘制了结果图。我似乎无法更改 x 轴标题或 y 轴标题。我收到此错误:

Error in plot.default(c(xi[, "lwr"], xi[, "upr"]), rep.int(yvals, 2L),  : 
  formal argument "xlab" matched by multiple actual arguments
Run Code Online (Sandbox Code Playgroud)

这是我的相关代码:

tuk <- TukeyHSD(final)
plot(tuk,xlab="Differences in mean departure times", ylab="Comparisons")
Run Code Online (Sandbox Code Playgroud)

我还需要更改 y 轴刻度线标签,但我不知道如何更改。

谢谢。

Nat*_*ate 6

因此,由于他们如何编写类对象plot()的方法,TukeyHSD默认情况下您无法更改轴标签,此详细信息隐藏在?TuketHSD手册页中。

但你可以轻松地拼凑出一个允许你这样做的副本。首先使用 找到现有方法的代码getAnywhere(plot.TukeyHSD)。然后像这样调整它:

tuk_plot <- function (x, xlab, ylab, ylabels = NULL, ...) {
  for (i in seq_along(x)) {
    xi <- x[[i]][, -4L, drop = FALSE]
    yvals <- nrow(xi):1L
    dev.hold()
    on.exit(dev.flush())
    plot(c(xi[, "lwr"], xi[, "upr"]), rep.int(yvals, 2L), 
         type = "n", axes = FALSE, xlab = "", ylab = "", main = NULL, 
         ...)
    axis(1, ...)
    # change for custom axis labels
    if (is.null(ylabels)) ylabels <- dimnames(xi)[[1L]]

    axis(2, at = nrow(xi):1, labels = ylabels, 
         srt = 0, ...)
    abline(h = yvals, lty = 1, lwd = 0.5, col = "lightgray")
    abline(v = 0, lty = 2, lwd = 0.5, ...)
    segments(xi[, "lwr"], yvals, xi[, "upr"], yvals, ...)
    segments(as.vector(xi), rep.int(yvals - 0.1, 3L), as.vector(xi), 
             rep.int(yvals + 0.1, 3L), ...)
    title(main = paste0(format(100 * attr(x, "conf.level"), 
                               digits = 2L), "% family-wise confidence level\n"), 
          # change for custom axis titles
          xlab = xlab, ylab = ylab)

    box()
    dev.flush()
    on.exit()
  }
}
Run Code Online (Sandbox Code Playgroud)

现在您可以调整 x 轴和 y 轴以及自定义 y 标签:

tuk_plot(tuk, "Hello X Axis", "Hello Y Axis", c("One", "Two", "Three"))
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

如果您不提供 y 标签,则会显示模型中的默认标签。

可重现的示例:

fm1 <- aov(breaks ~ wool + tension, data = warpbreaks))
tuk <- TukeyHSD(fm1, "tension")
Run Code Online (Sandbox Code Playgroud)