创建跨多个数量级的日志序列

时间:2014-05-28 02:32:09

标签: r ggplot2 seq

为了在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))

这是快速而又脏的,但它以日志间隔给出了2,000到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作为参数输入到更简单的表达式中。

5 个答案:

答案 0 :(得分:49)

我喜欢这个:

c(2:10 %o% 10^(3:7))

答案 1 :(得分:16)

lseq()中还有一个library("emdbook")函数,我只是将其复制/粘贴到我的代码中以进行日志刻度: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

答案 2 :(得分:1)

不确定这是否足够通用,但此功能至少应该是一个开始

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的指数。并且次要休息的次数比休息向量的实际长度多一个。

答案 3 :(得分:1)

@flodel很近,但是(如@ look-left所示)由于初始序列未记录,因此您会得到模式分布:

plot(c(2:10 %o% 10^(3:7)), log = 'y')

enter image description here

代替seq指数:

plot(10^(seq(1,10,.2)), log = 'y')

enter image description here

答案 4 :(得分:0)

这个会自动计算<div class="form-group"> <label for="position">Position</label> <?php echo form_open('signup'); $options = array( '' => 'Select Position', 'Department Chair' => 'Department Chair', 'Professor' => 'Professor', 'Guidance Faculty' => 'Guidance Faculty', 'OSA Faculty' => 'OSA Faculty', ); echo "<div class='drop_pos'>"; echo form_dropdown('position', $options, 'class="btn dropdown-toggle"', 'data-toggle="dropdown-menu"'); ?> <div class="text-danger"><?php echo form_error('position');?></div> </div> </div> <div class="form-group"> <label for="department">Department</label> <input class="form-control" name="department" placeholder="Department" type="text" value="<?php echo set_value('Department');?>"/> <span class="text-danger"><?php echo form_error('department');?></span> </div> 并支持length.out以确定增量有点类似于by

答案结合了@Christoph Safferling和https://stackoverflow.com/a/5237650/2480079

的解决方案
seq()

示例:

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)]  
}