gpt4 book ai didi

r - 如何强制 'polynom::polynomial' 对象中的尾随零? (特别是从 ggpubr 修改 stat_lm 和 stat_regline_equation 的行为)

转载 作者:行者123 更新时间:2023-12-01 23:22:11 25 4
gpt4 key购买 nike

我正在尝试修改 stat_regline_equation 的方式在用 ggscatter 绘制的图上显示回归线方程来自 R 包 ggpubr .具体来说,我想显示一致的系数位数,即使某些舍入系数具有尾随零(通常会被删除)也是如此。这是一个例子:

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')

enter image description here

图 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他们返回字符:

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类具有 round 的内置方法和 signif , 而对于 formatC 则没有,所以输出被强制用于后者。我可能会尝试修改 polynom::polynomial 的类定义,但在这个阶段,我觉得必须有一种更简单的方法来获得图表上显示的回归方程的尾随零。我希望这是一个足够普遍的愿望,希望有人有更简单的解决方案,或者至少这个答案可能对我以外的更多人有用。

最佳答案

编辑:此答案仅部分解决了问题。它仍然只显示 56.83 + 1 x 而不是 1.00 x。我将留下答案,因为其他人可能能够从中构建。

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

p <- as.character.polynomial(signif(x, digits = digits), decreasing = decreasing)

由于 as.character.polynomial,这将永远不会打印尾随零。因此,我们可以创建一个新的 as.character.polynomial 并允许这样做。作为示例,我只是稍微修改了现有代码,您可以进一步调整它:

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 = " ")
}

例子:

coefs %>%
polynom::as.polynomial() %>%
as.character.polynomial
# [1] "56.83 + 1.00*x

但是,.stat_lm 会将其输出为 italic(y)~`=`~56.83 + 1.00*~italic(x),因此它将是用作表达式。我对 ggplot2 不够熟悉,无法弄清楚其余部分,所以我会把它留给其他人。

enter image description here

关于r - 如何强制 'polynom::polynomial' 对象中的尾随零? (特别是从 ggpubr 修改 stat_lm 和 stat_regline_equation 的行为),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67942485/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com