首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在“polynom::polynomial”对象中强制尾随零?(具体地说,从ggpubr修改stat_lm和stat_regline_equation的行为)

如何在“polynom::polynomial”对象中强制尾随零?(具体地说,从ggpubr修改stat_lm和stat_regline_equation的行为)
EN

Stack Overflow用户
提问于 2021-06-12 03:16:01
回答 1查看 96关注 0票数 2

我正在尝试修改stat_regline_equation在用R包ggpubr中的ggscatter制作的绘图上显示回归线方程的方式。具体地说,我希望显示一致的系数位数,即使一些四舍五入的系数具有尾随零,这些零通常会被删除。下面是一个示例:

代码语言:javascript
复制
library(tidyverse)
library(ggpubr)

diamonds %>%
  filter(color %in% c("E", "H", "I")) %>%
  ggscatter(x="carat", y="table", add="reg.line") +
    facet_wrap(~color) +
    stat_regline_equation(label.y.npc = 'top')

图I很好,图H去掉了一个尾随零,图E完全去掉了斜率,因为它舍入到了1.00。基于一个很好的答案,我得到了here以及一个不同的答案here,我尝试使用trace(ggpubr:::.stat_lm, edit = TRUE)修改包代码,以修改以下代码中的第13和14行

eq.char <- as.character(signif(polynom::as.polynomial(coefs), 2))

eq.char <- as.character(formatC(polynom::as.polynomial(coefs), format = "f", digits = 2))

问题是:如果您将一个polynom::polynomial对象传递给signifround,它们将返回另一个polynom::polynomial对象,但对于formatCsprintf,它们将返回字符:

代码语言:javascript
复制
coefs = diamonds %>%
  filter(color=='E') %>%
  stats::lm(table~carat, .) %>%
  stats::coef()

coefs %>%
  polynom::as.polynomial() %>%
  formatC(format='f', digits=2) %>%
  class() %>%
  print()

coefs %>%
  polynom::as.polynomial() %>%
  signif(digits = 2) %>%
  class() %>%
  print()

[1] "character"
[1] "polynomial"

因此,我在上面使用formatC的尝试不起作用。我猜polynom::polynomial类有用于roundsignif的内置方法,没有用于formatC的内置方法,因此输出是强制用于后者的。我可能会尝试修改polynom::polynomial的类定义,但在这个阶段,我觉得必须有一种更简单的方法来在我的图形上显示的回归方程上获得尾随零。我希望这是一个足够普遍的愿望,希望有人有一个更容易的解决方案,或者至少一个答案可能对除我之外的更多的人有用。

EN

回答 1

Stack Overflow用户

发布于 2021-06-13 19:50:31

编辑:这个答案只能部分解决这个问题。它仍然只显示 56.83 + 1 x ,而不显示 1.00 x__.我留下了答案,因为其他人可能能够在此基础上进行构建。

问题的很大一部分是polynom:::print.polynomial,它包含:

代码语言:javascript
复制
p <- as.character.polynomial(signif(x, digits = digits), decreasing = decreasing)

由于as.character.polynomial,这将永远不会打印尾随零。因此,我们可以创建一个新的as.character.polynomial来实现这一点。我只是作为示例对现有代码进行了一些修改,您可以进一步调整它:

代码语言:javascript
复制
as.character.polynomial <- function (x, decreasing = FALSE, digits = 2, nsmall = 2) {
  p <- format(unclass(x), digits = digits, nsmall = nsmall)
  lp <- length(p) - 1
  names(p) <- 0:lp
  p <- p[as.numeric(p) != 0]
  if (length(p) == 0) 
    return("0")
  if (decreasing) 
    p <- rev(p)
  signs <- ifelse(as.numeric(p) < 0, "- ", "+")
  signs[1] <- if (signs[1] == "- ") "-" else ""
  np <- names(p)
  pow <- paste("x^", np, sep = "")
  pow[np == "0"] <- ""
  pow[np == "1"] <- "x"
  stars <- rep.int("*", length(p))
  stars[p == "" | pow == ""] <- ""
  paste0(signs, p, stars, pow, collapse = " ")
}

示例:

代码语言:javascript
复制
coefs %>%
  polynom::as.polynomial() %>%
  as.character.polynomial
# [1] "56.83 + 1.00*x

但是,.stat_lm随后会将其输出为italic(y)~`=`~56.83 + 1.00*~italic(x),因此它将被用作表达式。我对ggplot2还不够熟悉,无法弄清楚剩下的部分,所以我把这个问题留给其他人去做。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67942485

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档