在 ggpmisc 和 dev="tikz" 中对回归方程使用 round 或 sprintf 函数
Using `round` or `sprintf` function for Regression equation in ggpmisc and `dev="tikz"`
如何使用round
或sprintf
函数控制回归方程中的数值显示?我也不知道在使用 eq.with.lhs = "hat(Y)~
=~"
时如何使用 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 = "~~~"))
, 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()
Myaseen208,
这是使用 ggpmisc::stat_poly_eq()
创建 .tex
输出时出现问题的解决方法。我能够确认您目前无法将 stat_poly_eq()
和 "hat(Y)~
=~"
与 library(tikzDevice)
组合起来创建乳胶 .tex
输出。但是,我提供了一种解决方案,可以在此期间创建正确的 .tex
输出。
ggpmisc
软件包的创建者 Pedro Aphalo 非常友好地接受了 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 代码解决方案
第一步是修改代码输出需要的.tex
文件。完成后,我们就可以利用 gsub()
在 .tex
文件中找到所需的行,并将 {\itshape y};
替换为 {\^{y}};
[Lines 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/Whosebug/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 测试框架:
为了测试解决方案,我们可以创建一个小型乳胶测试工具。你可以在 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()
,这种方法的缺点是您必须自己编写一个回归线方程函数。这在您之前的 post 中讨论过:Adding Regression Line Equation and R2 on graph
如果您需要 [使用 geom_text] 的详细解决方案,请联系我。另一种选择是使用 ggpmisc [由我完成] 提交错误报告,看看作者是否已经解决或可以解决。
错误报告:https://bitbucket.org/aphalo/ggpmisc/issues/1/stat_poly_eq-fails-when-used-with
希望以上内容对您有所帮助。
1) 如果与 'ggpmisc'(版本 >= 0.2.9)
一起使用,下面的代码会回答问题的 dev="tikz"
部分
\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
。
如何使用round
或sprintf
函数控制回归方程中的数值显示?我也不知道在使用 eq.with.lhs = "hat(Y)~
=~"
时如何使用 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 = "~~~"))
, 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()
Myaseen208,
这是使用 ggpmisc::stat_poly_eq()
创建 .tex
输出时出现问题的解决方法。我能够确认您目前无法将 stat_poly_eq()
和 "hat(Y)~
=~"
与 library(tikzDevice)
组合起来创建乳胶 .tex
输出。但是,我提供了一种解决方案,可以在此期间创建正确的 .tex
输出。
ggpmisc
软件包的创建者 Pedro Aphalo 非常友好地接受了 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 代码解决方案
第一步是修改代码输出需要的.tex
文件。完成后,我们就可以利用 gsub()
在 .tex
文件中找到所需的行,并将 {\itshape y};
替换为 {\^{y}};
[Lines 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/Whosebug/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 测试框架:
为了测试解决方案,我们可以创建一个小型乳胶测试工具。你可以在 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()
,这种方法的缺点是您必须自己编写一个回归线方程函数。这在您之前的 post 中讨论过:Adding Regression Line Equation and R2 on graph
如果您需要 [使用 geom_text] 的详细解决方案,请联系我。另一种选择是使用 ggpmisc [由我完成] 提交错误报告,看看作者是否已经解决或可以解决。
错误报告:https://bitbucket.org/aphalo/ggpmisc/issues/1/stat_poly_eq-fails-when-used-with
希望以上内容对您有所帮助。
1) 如果与 'ggpmisc'(版本 >= 0.2.9)
一起使用,下面的代码会回答问题的dev="tikz"
部分
\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
。