Альтернатива вектору графических выражений

Я пытаюсь пометить ось на каждом третьем тике значением 10 ^ n, отформатированным как верхний индекс. Я использую grid графику. Я делаю что-то против баса. Вот MWE (или я вижу, что есть некоторые движения, чтобы назвать это репрексом):

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, но большинство из них, похоже, имеют дело с одним выражением в качестве метки или заголовка оси, а не с серией выражений. И большинство вопросов, связанных с метками осей, направлены на то, чтобы пометить каждый тик с помощью специальной функции.


person Bryan Hanson    schedule 14.10.2015    source источник


Ответы (1)


Вот что я бы сделал:

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)

введите здесь описание изображения

person Josh O'Brien    schedule 14.10.2015
comment
Спасибо! Там есть какая-то магия с parse и text, которую мне придется изучить. Я также ценю ваш альтернативный (и концептуально превосходный) способ передачи последовательностей. И более компактный код в целом. - person Bryan Hanson; 14.10.2015
comment
Пожалуйста! Чтобы узнать, что parse() делает в этом контексте, см. здесь и здесь в определении языка R. (Как оказалось, это одна из очень немногих ситуаций, когда вам, вероятно, следует использовать parse() для создания языковых объектов R. Лучшие альтернативы см. в разделе Вычисления на языке.) - person Josh O'Brien; 14.10.2015
comment
(Возможно, стоит отметить, что если вы хотите, чтобы некоторые из ваших выражений ничего не печатали, вам нужно установить для них что-то вроде phantom(.).) - person Josh O'Brien; 14.10.2015
comment
Я попробовал phantom() в моей чрезмерно сложной оригинальной версии labs, но она работала так же, как и пустые кавычки. Спасибо за дополнительные ссылки. - person Bryan Hanson; 14.10.2015