使用内联knitr
时,错误$\Sexpr{2.5e3}$
加上$2.5 \times 10^3$
非常好。但是,我想念这对于图中的标签不起作用的事实。我猜knitr认为有角色而不是数字。有没有办法改变它?
答案 0 :(得分:2)
正如我在评论中所讨论的那样,让这种情况自动发生并不容易,但要翻译你的音阶并不太难。 sfsmisc::eaxis()
是基础图的一个很好的解决方案。以下是一些ggplot
式解决方案:
如果您想使用原生?plotmath
- 样式格式:
##scale function for plotting y-axis labels
scientific_10 <- function(x) {
s <- scales::scientific_format()(x)
## substitute for exact zeros
s[s=="0e+00"] <- "0"
## regex: [+]? = "zero or one occurrences of '+'"
parse(text=gsub("e[+]?", " %*% 10^", s ))
}
或者如果你正在使用LaTeX / TikZ(我在这里使用Hmisc::latexSN()
。它是一个3行函数,所以你可以复制它,如果你想避免依赖或破解它):
scientific_latex <- function(x,scipen=-2) {
require(Hmisc)
op <- options(scipen=scipen) ## encourage use of scientific notation
on.exit(options(op)
s <- paste0("$",Hmisc::latexSN(x),"$")
}
示例:
set.seed(101)
d <- data.frame(trait=runif(1000),
time=runif(1000,0,1000))
library(ggplot2); theme_set(theme_bw())
## make plot
breaks.y<-seq(from=0, to=1000, by=200)
g0 <- ggplot(d,aes(trait,time))+
geom_point()
plotmath
样式:
g0 + scale_y_continuous(label=scientific_10,
breaks=breaks.y, limits=c(0,1000))
TikZ:
g0 + scale_y_continuous(label=scientific_latex,
breaks=breaks.y, limits=c(0,1000))
答案 1 :(得分:0)
在@Ben Bolker发表评论之后,我在这里添加了我的解决方案,也许更多的是knitr
心情,因为将knitr
渲染应用于轴标签只是一种破解。特别是在knitr
文档中,通常会在开头digits
和scipen
中设置它,并期望它可以在任何地方应用。
因此在setup chunk中定义函数:
inline_hook <- function (x) {
if (is.numeric(x)) {
x = knitr:::format_sci(x, "latex")
i = grep("[^0-9.,]", x)
x[i] = sprintf("\\ensuremath{%s}", x[i])
if (getOption("OutDec") != ".")
x = sprintf("\\text{%s}", x)
}
if (is.numeric(x)) x = round(x, getOption("digits"))
x
}
只是knitr::.inline.hook.tex
和knitr:::.inline.hook
的混合,最后collapse
被丢弃。然后根据this post修改scale_y_continous
的默认行为:
scale_y_continuous <- function(...) ggplot2:::scale_y_continuous(..., labels=inline_hook)
然后从上面的例子:
set.seed(101)
d <- data.frame(trait=runif(1000),
time=runif(1000,0,1000))
library(ggplot2); theme_set(theme_bw())
## make plot
breaks.y<-seq(from=0, to=1000, by=200)
g0 <- ggplot(d,aes(trait,time))+
geom_point()
g0
我默认获得:
这正是knitr
给出的内联编号。