Ответ 1
Мне нравится этот:
c(2:10 %o% 10^(3:7))
Чтобы установить пользовательские интервалы прерывания для шкалы журнала в диаграмме ggplot2, я создал следующий вектор из нескольких последовательностей.
breaks <- c(seq(2000, 10000, by = 1000),
seq(20000, 100000, by = 10000),
seq (200000, 1000000, by = 100000),
seq (2000000,10000000, by = 1000000),
seq (20000000,100000000, by = 10000000))
Это быстро и грязно, но это дает мне желаемые перерывы от 2000 до 100 000 000 в журнальных интервалах.
> breaks
[1] 2e+03 3e+03 4e+03 5e+03 6e+03 7e+03 8e+03 9e+03 1e+04 2e+04 3e+04 4e+04
[13] 5e+04 6e+04 7e+04 8e+04 9e+04 1e+05 2e+05 3e+05 4e+05 5e+05 6e+05 7e+05
[25] 8e+05 9e+05 1e+06 2e+06 3e+06 4e+06 5e+06 6e+06 7e+06 8e+06 9e+06 1e+07
[37] 2e+07 3e+07 4e+07 5e+07 6e+07 7e+07 8e+07 9e+07 1e+08
Как очистить этот фрагмент кода, чтобы сделать его более гибким? Поиск многих решений последовательности журналов, существующих библиотек и моих собственных проб и ошибок был не очень плодотворным.
В идеале я хотел бы ввести From, To и NumberOfMinorIntervals в качестве параметров в более простое выражение.
Мне нравится этот:
c(2:10 %o% 10^(3:7))
В library("emdbook")
есть функция lseq()
, которую я просто копирую/вставляю в свой код для тиков журнала: http://artax.karlin.mff.cuni.cz/r-help/library/emdbook/html/lseq.html
Я написал свою собственную функцию, чтобы использовать ее таким образом:
lseq <- function(from=1, to=100000, length.out=6) {
# logarithmic spaced sequence
# blatantly stolen from library("emdbook"), because need only this
exp(seq(log(from), log(to), length.out = length.out))
}
Запуск lseq()
затем возвращает 1 10 100 1000 10000 100000
Не уверен, что для вас это достаточно общее, но эта функция должна, по крайней мере, начинаться
logbreaks<-function(from=3, to=7, m=10) {
unlist(lapply(3:7, function(x) seq(2*10^x, 10*10^x, length.out=m-1)), )
}
#generate your data
logbreaks(3,7,10)
Параметры to/from в качестве показателей 10. И число незначительных разрывов больше, чем фактическая длина вектора разрыва.
Этот автоматически вычисляет length.out
, а также поддерживает by
, чтобы определить инкремент, несколько аналоговый с seq()
Ответ объединяет решение @Christoph Safferling и fooobar.com/questions/64595/...
lseqBy <- function(from=1, to=100000, by=1, length.out=log10(to/from)+1) {
tmp <- exp(seq(log(from), log(to), length.out = length.out))
tmp[seq(1, length(tmp), by)]
}
Примеры:
> lseqBy(from = 10, to = 100000, by = 1)
[1] 1e+01 1e+02 1e+03 1e+04 1e+05
> lseqBy(from = 10, to = 100000, by = 2)
[1] 1e+01 1e+03 1e+05
> lseqBy(from = 10, to = 100000, by = 3)
[1] 10 10000
@flodel близок, но поскольку начальная последовательность не записывается в журнал, вы получаете шаблонное распределение:
plot(c(2:10 %o% 10^(3:7)), log = 'y')
Вместо этого просто seq
показателю степени:
plot(10^(seq(1,10,.2)), log = 'y')