我正在尝试修改stat_regline_equation在用R包ggpubr中的ggscatter制作的绘图上显示回归线方程的方式。具体地说,我希望显示一致的系数位数,即使一些四舍五入的系数具有尾随零,这些零通常会被删除。下面是一个示例:
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对象传递给signif或round,它们将返回另一个polynom::polynomial对象,但对于formatC或sprintf,它们将返回字符:
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的类定义,但在这个阶段,我觉得必须有一种更简单的方法来在我的图形上显示的回归方程上获得尾随零。我希望这是一个足够普遍的愿望,希望有人有一个更容易的解决方案,或者至少一个答案可能对除我之外的更多的人有用。
发布于 2021-06-13 19:50:31
编辑:这个答案只能部分解决这个问题。它仍然只显示 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还不够熟悉,无法弄清楚剩下的部分,所以我把这个问题留给其他人去做。

https://stackoverflow.com/questions/67942485
复制相似问题