【问题标题】:Python function equivalent to R's `pretty()`?Python 函数相当于 R 的`pretty()`?
【发布时间】:2017-08-21 21:14:15
【问题描述】:

我正在 Python 中复制一些 R 代码。

我被 R 的 pretty() 绊倒了。

我只需要pretty(x),其中x 是一些数字。

大致上,函数“计算漂亮的断点”作为几个“圆形”值的序列。我不确定是否有 Python 等价物,而且我在 Google 上运气不佳。

编辑:更具体地说,这是pretty 帮助页面中的描述条目:

描述:计算一个大约 n+1 个等距“圆形”值的序列,这些值覆盖了 x 中的值的范围。选择的值是 10 的 1、2 或 5 倍。

我查看了 R 的 pretty.default() 以了解 R 对该函数的确切作用,但它最终使用了 .Internal()——这通常会导致黑暗的 R 魔法。我想我会在潜入之前四处打听。

有谁知道 Python 是否有与 R 的 pretty() 等价的东西?

【问题讨论】:

  • pandas 有cut,numpy 有linspace,但不幸的是它们不会产生四舍五入的值。
  • @ayhan 我实际上认为最接近的可能是 matplotlib 在绘图上的默认刻度设置行为......虽然没有找到任何接近的东西。

标签: python r pandas numpy scipy


【解决方案1】:

它不像 R 那样优雅,但你仍然可以使用 numpy:

import numpy as np
np.linspace(a,b,n,dtype=int)

其中a 是范围的开始,b 是结束,n 是值的数量,而输出类型是int

例如:

np.linspace(0,10,11,dtype=int)

数组([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10])

当然,如果你想让它更优雅,你可以把它包裹起来:

pretty = lambda x: np.linspace(0,x,11,dtype=int)
pretty(10)

【讨论】:

    【解决方案2】:

    numpy.arange 呢?

    import numpy as np
    
    print np.arange(0,16,3)
    

    $ [ 0 3 6 9 12 15]

    【讨论】:

      【解决方案3】:

      我认为 Lewis Fogden 发布的伪代码看起来很熟悉,而且我们确实曾经用 C++ 编写过该伪代码用于绘图例程(以确定 漂亮 轴标签)。我很快将它翻译成 Python,不确定这是否类似于 R 中的pretty(),但我希望它对任何人都有帮助或有用..

      import numpy as np
      
      def nicenumber(x, round):
          exp = np.floor(np.log10(x))
          f   = x / 10**exp
      
          if round:
              if f < 1.5:
                  nf = 1.
              elif f < 3.:
                  nf = 2.
              elif f < 7.:
                  nf = 5.
              else:
                  nf = 10.
          else:
              if f <= 1.:
                  nf = 1.
              elif f <= 2.:
                  nf = 2.
              elif f <= 5.:
                  nf = 5.
              else:
                  nf = 10.
      
          return nf * 10.**exp
      
      def pretty(low, high, n):
          range = nicenumber(high - low, False)
          d     = nicenumber(range / (n-1), True)
          miny  = np.floor(low  / d) * d
          maxy  = np.ceil (high / d) * d
          return np.arange(miny, maxy+0.5*d, d)
      

      这会产生例如:

      pretty(0.5, 2.56, 10)
      pretty(0.5, 25.6, 10)
      pretty(0.5, 256, 10 )
      pretty(0.5, 2560, 10)
      

      [ 0.5 1. 1.5 2. 2.5 3. ]

      [0. 5. 10. 15. 20. 25. 30.]

      [0. 50. 100. 150. 200. 250. 300.]

      [0. 500. 1000. 1500. 2000. 2500. 3000.]

      【讨论】:

        猜你喜欢
        • 2017-05-10
        • 1970-01-01
        • 2011-06-25
        • 2020-01-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-10-31
        相关资源
        最近更新 更多