Использование функции `round` или`sprintf` для уравнения регрессии в ggpmisc и `dev="tikz"`

Как я могу управлять числовым отображением в уравнении регрессии с помощью round или же sprintf функционировать? Я также не мог понять, как использовать dev="tikz" когда используешь eq.with.lhs = "hat(Y)~знак равно~",

library(ggplot2)
library(ggpmisc)

# generate artificial data
set.seed(4321)
x <- 1:100
y <- (x + x^2 + x^3) + rnorm(length(x), mean = 0, sd = mean(x^3) / 4)
my.data <- data.frame(x, 
                      y, 
                      group = c("A", "B"), 
                      y2 = y * c(0.5,2),
                      block = c("a", "a", "b", "b"))

str(my.data)

# plot
ggplot(data = my.data, mapping=aes(x = x, y = y2, colour = group)) +
        geom_point() +
        geom_smooth(method = "lm", se =  FALSE, formula = y ~ poly(x=x, degree = 2, raw = TRUE)) +
        stat_poly_eq(
                       mapping     = aes(label = paste(..eq.label.., ..rr.label.., sep = "~~~"))
                     , data        = NULL
                     , geom        = "text"
                     , formula     = y ~ poly(x, 2, raw = TRUE)
                     , eq.with.lhs = "hat(Y)~`=`~"
                     , eq.x.rhs    = "X"
                     , label.x     = 0
                     , label.y     = 2e6
                     , vjust       = c(1.2, 0)
                     , position    = "identity"
                     , na.rm       = FALSE
                     , show.legend = FALSE
                     , inherit.aes = TRUE
                     , parse       = TRUE
                     ) +
        theme_bw()

2 ответа

Решение

1) Код ниже отвечает dev="tikz" часть вопроса, если используется с 'ggpmisc' (версия>= 0.2.9)

\documentclass{article}

\begin{document}

<<setup, include=FALSE, cache=FALSE>>=
library(knitr)
opts_chunk$set(fig.path = 'figure/pos-', fig.align = 'center', fig.show = 'hold',
               fig.width = 7, fig.height = 6, size = "footnotesize", dev="tikz")
@


<<>>=
library(ggplot2)
library(ggpmisc)
@

<<>>=
# generate artificial data
set.seed(4321)
x <- 1:100
y <- (x + x^2 + x^3) + rnorm(length(x), mean = 0, sd = mean(x^3) / 4)
my.data <- data.frame(x,
                      y,
                      group = c("A", "B"),
                      y2 = y * c(0.5,2),
                      block = c("a", "a", "b", "b"))

str(my.data)
@

<<>>=
# plot
ggplot(data = my.data, mapping=aes(x = x, y = y2, colour = group)) +
  geom_point() +
  geom_smooth(method = "lm", se =  FALSE, 
              formula = y ~ poly(x=x, degree = 2, raw = TRUE)) +
  stat_poly_eq(
    mapping     = aes(label = paste("$", ..eq.label.., "$\\ \\ \\ $",
                       ..rr.label.., "$", sep = ""))
    , geom        = "text"
    , formula     = y ~ poly(x, 2, raw = TRUE)
    , eq.with.lhs = "\\hat{Y} = "
    , output.type = "LaTeX"
   ) +
  theme_bw()
@

\end{document}

Спасибо за предложение об этом улучшении, я, безусловно, тоже найду для него применение!

2) Ответ на roundа также sprintf часть вопроса. Вы не можете использовать round или же sprintf изменить количество цифр, stat_poly_eq в настоящее время использует signif с тремя значащими цифрами в качестве аргумента, примененного ко всему вектору коэффициентов. Если вы хотите полный контроль, то вы можете использовать другую статистику, stat_fit_glanceэто также в ggpmisc (>= 0,2,8), который использует broom:glance внутренне. Это гораздо более гибко, но вам придется позаботиться обо всем формировании самостоятельно в рамках звонка aes, На данный момент есть один улов, broom::glance кажется, не работает правильно с poly, вам нужно будет явно написать полиномиальное уравнение для передачи в качестве аргумента formula,

Myaseen208,

Вот обходной путь для проблемы с созданием .tex вывод с ggpmisc::stat_poly_eq(), Я смог подтвердить, что вы не можете объединить stat_poly_eq(), а также "hat(Y)~ знак равно ~" с library(tikzDevice) создать латекс .tex выход. Я, однако, предоставил решение для создания правильного .tex выход в промежуточный период.

Педро Афало, создатель ggpmisc пакет очень любезно принял запрос на расширение ggpmisc::stat_poly_eq(), В соответствии с запрошенным отчетом об ошибке поданной и на которую ссылаются ниже.

Пример кода:

Следующий код создаст изображение без символа шляпы:

# Load required packages
requiredPackages <- requiredPackages <- c("ggplot2", "ggpmisc", "tikzDevice", "latex2exp")

# ipak - Check to see if the package is installed, if not install and then load...
ipak <- function(pkg)
{
  new.pkg <- pkg[!(pkg %in% installed.packages()[, "Package"])]
  if (length(new.pkg))
    install.packages(new.pkg, dependencies = TRUE)
  sapply(pkg, require, character.only = TRUE)
}

ipak(requiredPackages)

# generate artificial data
set.seed(4321)
x <- 1:100
y <- (x + x ^ 2 + x ^ 3) + rnorm(length(x), mean = 0, sd = mean(x ^ 3) / 4)
my.data <- data.frame(
  x, y,
  group = c("A", "B"),
  y2 = y * c(0.5, 2),
  block = c("a", "a", "b", "b")
)

# Define Formaula..
formulaDefined <- (y ~ (poly(x = x, degree = 2, raw = TRUE)))

gp <- ggplot(data = my.data, mapping = aes(x = x, y = y2, colour = group))
gp <- gp + geom_point()
gp <- gp + geom_smooth(method = "lm", se =  FALSE, formula = formulaDefined )
gp <- gp + stat_poly_eq(
  aes(label = paste(..eq.label.., "~~~", ..rr.label.., sep = "")),
#  eq.with.lhs = "italic(hat(y))~`=`~",
  formula     = formulaDefined,
  geom        = "text",
  label.x     = 0,
  label.y     = 2e6,
  vjust       = c(1.2, 0),
  position    = "identity",
  na.rm       = FALSE,
  show.legend = FALSE,
  inherit.aes = TRUE,
  parse       = TRUE)
gp <- gp + theme_bw()
gp

Теперь мы можем изменить этот код и его tikz output создать желаемый результат:

Tikz Code Solution

Первый шаг - изменить код для вывода требуемого .tex файл. После этого мы можем использовать gsub() найти нужные строки в .tex файл и заменить {\itshape y}; с {\^{y}}; [Строки 646 и 693 ].

# Load required packages
requiredPackages <- requiredPackages <- c("ggplot2", "ggpmisc", "tikzDevice", "latex2exp")

# ipak - Check to see if the package is installed, if not install and then load...
ipak <- function(pkg)
{
  new.pkg <- pkg[!(pkg %in% installed.packages()[, "Package"])]
  if (length(new.pkg))
    install.packages(new.pkg, dependencies = TRUE)
  sapply(pkg, require, character.only = TRUE)
}

ipak(requiredPackages)

# generate artificial data
set.seed(4321)
x <- 1:100
y <- (x + x ^ 2 + x ^ 3) + rnorm(length(x), mean = 0, sd = mean(x ^ 3) / 4)
my.data <- data.frame(
  x, y,
  group = c("A", "B"),
  y2 = y * c(0.5, 2),
  block = c("a", "a", "b", "b")
)

setwd("~/dev/stackru/37242863")

texFile <- "./test2.tex"
# setup tex output file
tikz(file = texFile, width = 5.5, height = 5.5)

#Define Formaula..
formulaDefined <- (y ~ (poly(x = x, degree = 2, raw = TRUE)))

gp <- ggplot(data = my.data, mapping = aes(x = x, y = y2, colour = group))
gp <- gp + geom_point()
gp <- gp + geom_smooth(method = "lm", se =  FALSE, formula = formulaDefined )
gp <- gp + stat_poly_eq(
  aes(label = paste(..eq.label.., "~~~", ..rr.label.., sep = "")),
#  eq.with.lhs = "italic(hat(y))~`=`~",
  formula     = formulaDefined,
  geom        = "text",
  label.x     = 0,
  label.y     = 2e6,
  vjust       = c(1.2, 0),
  position    = "identity",
  na.rm       = FALSE,
  show.legend = FALSE,
  inherit.aes = TRUE,
  parse       = TRUE)
gp <- gp + theme_bw()
gp
dev.off()

## OK, now we can take the test.txt file and replace the relevant attributes to
## add the hat back to the y in the .tex output file...

texOutputFile <- readLines(texFile)
y <- gsub('itshape y', '^{y}', texOutputFile )
cat(y, file=texFile, sep="\n")

Tex Test Framework:

Чтобы проверить решение, мы можем создать небольшой латексный испытательный комплект. Вы можете загрузить этот файл в RStudio [ t1.tex ] и затем скомпилируйте его; это будет тянуть test2.text, сгенерированный с помощью ранее представленного кода.

в северном направлении RStudio - отличная платформа для скомпилированного латексного вывода из R.

\documentclass{article}

\usepackage{tikz}

\begin{document}

\begin{figure}[ht]
\input{test2.tex}
\caption{Sample output from tikzDevice 2}
\end{figure}

\end{document}

результат:

Альтернативное решение

Другой вариант может быть использовать geom_text() Недостатком этого подхода является то, что вы сами должны написать функцию уравнения линии регрессии. Это обсуждалось в вашем предыдущем посте: Добавление уравнения регрессии и R2 на графике

Если вам нужно подробное решение [с geom_text], тогда пингуйте меня. Другой вариант - отправить отчет об ошибке в ggpmisc [сделано мной] и посмотреть, обратился ли автор уже или может обратиться.

Отчет об ошибке: https://bitbucket.org/aphalo/ggpmisc/issues/1/stat_poly_eq-fails-when-used-with

Я надеюсь, что выше помогает.

Другие вопросы по тегам