【问题标题】:Create a log sequence across multiple orders of magnitude创建跨越多个数量级的日志序列
【发布时间】:2014-05-28 02:32:09
【问题描述】:

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

如何清理这段代码的 sn-p 以使其更灵活?对许多日志序列解决方案、现有库和我自己的反复试验的搜索并不是很有成果。

理想情况下,我想将 From、To 和 NumberOfMinorIntervals 作为参数输入到更简单的表达式中。

【问题讨论】:

    标签: r ggplot2 seq


    【解决方案1】:

    我喜欢这个:

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

    【讨论】:

    • 现在很短!我修改了第一个序列以包括休息次数:c(seq(2,10,10/10) %o% 10^(3:7)) 或类似的东西最终...c(seq(2,10, 10/NumBreaks) %o% 10^(From:To))
    • 偶然发现这个,需要大量的支持!
    • 这是如何工作的?这个花哨的%o% 运算符是什么?
    • %o% 是外部二进制产品,如下所示:cran.r-project.org/doc/manuals/R-lang.html#Operators
    【解决方案2】:

    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

    【讨论】:

    • 谢谢!这比当前最受欢迎的答案更不言自明。此外,该答案更准确地重现了提问者的示例,但此解决方案更优雅,因为序列的每个元素都是前一个元素乘以一个常数。
    【解决方案3】:

    @flodel 很接近,但是(如@look-left 注释)由于初始序列不是日志,因此您会得到一个模式分布:

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

    而只是seq 指数:

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

    【讨论】:

      【解决方案4】:

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

      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 的指数。并且次要中断的数量比中断向量的实际长度多 1。

      【讨论】:

      • 我应该稍微清楚一点。我需要指定每个主要之间的次要间隔数。但这个想法给了我一些可以玩和学习的东西。谢谢。
      【解决方案5】:

      这个自动计算length.out并且还支持by来确定增量有点类似于seq()

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

      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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-02-10
        • 1970-01-01
        • 1970-01-01
        • 2011-06-18
        • 1970-01-01
        相关资源
        最近更新 更多