2

Rパッケージからstat_regline_equation作成されたプロットに回帰直線方程式を表示する方法を変更しようとしています。具体的には、丸められた係数の末尾にゼロがあり、通常は削除される場合でも、一貫した桁数の係数を表示したいと考えています。次に例を示します。ggscatterggpubr

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 では末尾のゼロが 1 つ削除され、グラフ E では勾配が 1.00 に丸められているため、勾配が完全に削除されています。ここで得た素晴らしい回答と別の回答に基づいて、パッケージ コードを変更して、13 行目と 14 行目を変更しようとしました。trace(ggpubr:::.stat_lm, edit = TRUE)

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オブジェクトを渡すと、別のオブジェクトが返されますが、またはの場合は文字が返されます。signifroundpolynom::polynomialformatCsprintf

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ありますが、この段階では、グラフに表示される回帰方程式の末尾のゼロを取得する簡単な方法が必要だと感じています。そして、これが誰かがより簡単な解決策を見つけられるように、または少なくとも私以外の多くの人に役立つ答えが得られるように、これが十分に一般的な欲求であることを願っています.

4

2 に答える 2

3

編集:この回答は、問題を部分的にのみ修正します。56.83 + 1 xの代わりにのみ表示されます1.00 x。他の誰かがこれから構築できるかもしれないので、私は答えを残しています。

問題の大部分はpolynom:::print.polynomial、以下を含む です。

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

これにより、末尾のゼロが出力されることはありませんas.character.polynomialas.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ので、他の方にお任せします。

ここに画像の説明を入力

于 2021-06-13T11:50:31.083 に答える