2015-10-14 58 views
2

我试图用10^n的值在每个第三个刻度处标记一个轴,格式化为上标。我正在使用grid图形。我在做一些粗心大意的事情。这里有一个MWE(或我看到有一些运动,称之为reprex):替代矢量的Plotmath表达式

library("grid") 
grid.newpage() 
axisVP <- viewport(width = unit(6, "inches"), height = unit(0.01, "inches")) 
pushViewport(axisVP) 
labs <- c(1, "", "", expression(10^{-3}), "", "", expression(10^{-6}), "", "", 
    expression(10^{-9}), "", "", expression(10^{-12})) 
grid.xaxis(at = seq(0, 1, length.out = 15)[-c(1,15)], label = labs) 

不过,这仅与标签1.第一跳在str(labs)看它是与长度13的表达如预期。表达式被grid.xaxis接受。所以我不太确定为什么只显示第一个值。我已经在SO上探讨了相关的问题,但大多数似乎都将单个表达式作为轴标签或标题处理,而不是一系列表达式。大多数涉及轴标签的问题都试图使用专门的功能标记每个刻度。

回答

2

这里就是我想要做的:

library(grid) 
grid.newpage() 
axisVP <- viewport(width = unit(6, "inches"), height = unit(0.01, "inches")) 
pushViewport(axisVP) 

## First plot an axis with all ticks and no labels 
ticks_at <- seq(1/15, 14/15, length.out=13) 
grid.xaxis(at = ticks_at, label=FALSE) 

## Then add labels where you want them 
labs <- parse(text=c("1", "10^{-3}", "10^{-6}", "10^{-9}", "10^{-12}")) 
## Alternatively, use this, though in practice it's more cumbersome 
# labs <- c(expression(1), expression(10^{-3}), expression(10^{-6}), 
#   expression(10^{-9}), expression(10^{-12})) 
labs_at <- seq(1/15, 14/15, length.out=5) 
grid.xaxis(at = labs_at, label = labs) 

enter image description here

+0

谢谢!这里有一些魔法,我必须学习'parse'和'text'。我也非常感谢你们提供的替代(并且在概念上更为优越)的方式来传达序列。而通常更精简的代码。 –

+1

不客气!要了解'parse()'在这种情况下做了什么,请参阅[here](https://cran.r-project.org/doc/manuals/r-release/R-lang.html#Internal-representation)和R语言定义中的[here](https://cran.r-project.org/doc/manuals/r-release/R-lang.html#Expression-objects)。 (事实证明,这是极少数情况下,你应该使用'parse()'来构造R语言对象。为了更好的选择,请参阅[计算语言]部分(https:/ /cran.r-project.org/doc/manuals/r-release/R-lang.html#Computing-on-the-language)。) –

+0

(可能值得注意的是,如果你想让你的一些表达式不要打印任何东西,你需要将它们设置为'phantom(。)'。) –