scipy Python函数等价于R's 'pretty()'?

tvmytwxo  于 2022-11-09  发布在  Python
关注(0)|答案(4)|浏览(152)

我在用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()的东西吗?

0s7z1bwu

0s7z1bwu1#

我认为刘易斯Fogden发布的伪代码看起来很熟悉,我们确实曾经用C++编写过一个绘图例程的伪代码(用于确定 pretty 轴标签)。我很快将其翻译成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。】

nzkunb0c

nzkunb0c2#

它不像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)
odopli94

odopli943#

那纳比怎么办?

import numpy as np

print np.arange(0,16,3)

$ [ 0 3 6 9 12 15]

7z5jn7bk

7z5jn7bk4#

下面是一些python代码,它们的作用与R几乎相同,除了x的范围为零或非常小的情况:

def pretty(x, n):
    """
    Returns a "pretty" set of bin boundaries roughly of size n
    that span x. Use, for instance, like:
      plt.hist(x, bins=pretty(x, 40))
    """
    # see https://github.com/wch/r-source/blob/trunk/src/appl/pretty.c
    h = 1.5
    h5 = .5 + 1.5 * h
    lo = np.nanmin(x)
    up = np.nanmax(x)
    assert up > lo, "All values are the same."
    c = (up - lo) / n
    b = 10**np.floor(np.log10(c))
    m = [1, (2+h)/(1+h), (5+2*h5)/(1+h5), (10+5*h)/(1+h), 10]
    k = np.digitize(c/b, m)
    u = b * [1, 2, 5, 10][k-1]
    ns = np.floor(lo / u + 1e-10)
    nu = np.ceil(up / u - 1e-10)
    return np.arange(ns * u, (nu + 1) * u, u)
  • 编辑:* 修复了一个索引错误。

相关问题