Использование функции `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
Я надеюсь, что выше помогает.