R中的绘图函数产生图例而不调用legend()

Posted

技术标签:

【中文标题】R中的绘图函数产生图例而不调用legend()【英文标题】:plot function in R producing legend without legend() being called 【发布时间】:2021-08-26 11:57:36 【问题描述】:

我正在尝试使用 R 中的 plot() 为竞争危害生存分析生成累积发生率图。出于某种原因,生成的图有一个我没有调用的图例。图例与我图表上的线条相交,我不知道如何摆脱它。请帮忙!

我的代码如下:

CompRisk2 <- cuminc(ftime=ADI$time_DeathTxCensor, fstatus=ADI$status, group=ADI$natADI_quart)
cols <- c("darkorange","coral1","firebrick1","firebrick4","lightskyblue","darkturquoise","dodgerblue","dodgerblue4")
par(bg="white")
plot(CompRisk2,
     col=cols,
     xlab="Years",
     ylab="Probability of Mortality or Transplant",
     xlim=c(0,10),
     ylim=c(0,0.6))

这会产生以下情节:

我尝试添加以下代码以将图例移出框架,但出现错误:

legend(0,5, legend=c(11,21,31,41,12,22,32,42),
col=c("darkorange","coral1","firebrick1","firebrick4","lightskyblue","darkturquoise","dodgerblue","dodgerblue4"),
lty=1:2, cex=0.8, text.font=4, box.lty=0)

错误:标题错误(...):无效的图形参数

任何帮助将不胜感激!

【问题讨论】:

【参考方案1】:

我不认为省略号参数用于plot.cuminc 内的legend 调用。 Ben 的回答中提供的代码表明可能有一个 wh 参数来确定图例的位置。在他提供的代码中,它没有在参数中命名为“x”,而是作为位置定义的参数给出。如果您查看 plot.cuminc 函数,您实际上会发现 wh 已记录在案。

我无法对此进行测试,因为您没有向我们提供对 ADI-object 的访问权限,但我的建议是尝试:

opar <- par(xpd=TRUE) # xpd lets graphics be placed 'outside'
plot(CompRisk2,
     col=cols, wh=c(-.5, 7), 
     xlab="Years",
     ylab="Probability of Mortality or Transplant",
     xlim=c(0,10),
     ylim=c(0,0.6))
 par(opar)  # restores original graphics parameters

在没有测试的情况下发布代码块总是有点冒险,但我很高兴地报告我确实找到了合适的测试,并且它似乎可以按预期合理地工作。在 SO 问题 prior question about using the gg-packages for cmprsk 中的对象上使用以下代码:

library(cmprsk)
# some simulated data to get started
comp.risk.data <- data.frame("tfs.days" = rweibull(n = 100, shape = 1, scale = 1)*100,
                             "status.tfs" = c(sample(c(0,1,1,1,1,2), size=50, replace=T)),
                             "Typing" = sample(c("A","B","C","D"), size=50, replace=T))

# fitting a competing risks model
CR <- cuminc(ftime = comp.risk.data$tfs.days, 
             fstatus = comp.risk.data$status.tfs, 
             cencode = 0,
             group = comp.risk.data$Typing)

opar <- par(xpd=TRUE) # xpd lets graphics be placed 'outside'
plot(CR,
      wh=c(-15, 1.1),  # obviously different than the OP's coordinates
     xlab="Years",
     ylab="Probability of Mortality or Transplant",
     xlim=c(0,400),
     ylim=c(0,1))
par(opar)   # restores graphics parameters

我让图例从其原始位置向上和向左移动。

【讨论】:

【参考方案2】:

您正在使用 cmprsk 包中的 cuminc 函数。这将产生一个 cuminc 类的对象,它具有 S3 绘图方法。 ?plot.cuminc 显示文档,输入 plot.cuminc 显示代码。

有一些略显晦涩的代码暗示了一种解决方法:

 u <- list(...)
    if (length(u) > 0) 
        i <- pmatch(names(u), names(formals(legend)), 0)
        do.call("legend", c(list(x = wh[1], y = wh[2], legend = curvlab, 
            col = color, lty = lty, lwd = lwd, bty = "n", bg = -999999), 
            u[i > 0]))
    

这表示在... 中传递的任何其他参数其名称与legend 的参数名称匹配 将被传递给legend()legend() 有一个 plot 参数:

情节:合乎逻辑。如果为“FALSE”,则不绘制任何内容,但返回大小。

所以看起来将plot=FALSE 添加到您的plot() 命令将起作用。

原则上,您可以尝试查看legend() 的其他参数,看看它们是否会根据需要调整图例位置/大小。不幸的是,legend 的 x 参数(将确定水平位置)被 plot.cuminc 的第一个参数所掩盖。

【讨论】:

这是一个极其罕见的例子,你似乎错过了显而易见的事情。我提到只是因为你通常是“街区最聪明的孩子”w.r.t。回归包,如果有点不完整,我确实发现答案很有用。我想你在盯着答案。

以上是关于R中的绘图函数产生图例而不调用legend()的主要内容,如果未能解决你的问题,请参考以下文章

R语言_legend()函数用法

Matplotlib Legend 中的自定义艺术家

图例中的变量名称,matlab

R plot legend plot.xy中的错误(xy,type,...):无效的绘图类型

怎样在r语言 中 只改变 图例框大小 而不改变其中文字的大小?

R语言ggplot2可视化散点图移除可视化图像中的多余的图例信息使用scale_size函数移除数据点大小的图例(legend)