knitr没有勾勒出情节中的科学记数法

时间:2016-06-07 15:04:48

标签: r label hook knitr

使用内联knitr时,错误$\Sexpr{2.5e3}$加上$2.5 \times 10^3$非常好。但是,我想念这对于图中的标签不起作用的事实。我猜knitr认为有角色而不是数字。有没有办法改变它?

2 个答案:

答案 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))

enter image description here

TikZ:

g0 + scale_y_continuous(label=scientific_latex,
                   breaks=breaks.y, limits=c(0,1000))

enter image description here

答案 1 :(得分:0)

在@Ben Bolker发表评论之后,我在这里添加了我的解决方案,也许更多的是knitr心情,因为将knitr渲染应用于轴标签只是一种破解。特别是在knitr文档中,通常会在开头digitsscipen中设置它,并期望它可以在任何地方应用。

因此在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.texknitr:::.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

我默认获得:

tikz picture

这正是knitr给出的内联编号。