代码之家  ›  专栏  ›  技术社区  ›  Joel

try…除了处理matplotlib版本

  •  0
  • Joel  · 技术社区  · 5 年前

    我的机器有两个不同版本的matplotlib(或者更确切地说,我的学生有)。较新的 plt.hist 提出论点 density ,而年长者则持类似观点 normed 这些论点让我能够绘制比例而不是计数。我想我可以用它来运行 try... except... 但我遇到了一个问题。

    我的代码是

    import matplotlib.pyplot as plt
    import numpy as np
    
    N=1000
    sizes = [np.random.binomial(100, 0.03) for counter in range(N)]
    
    fig = plt.figure(1)
    main = plt.axes()
    
    try:  
        main.hist(sizes, bins = range(21), density = True) 
    except AttributeError:
        main.hist(sizes, bins = range(21), normed = True) 
    
    main.axis(ymax=0.4)
    

    enter image description here

    这就是我没有设置的地方 ymax

    enter image description here

    这是使用matplotlib v2.0.0运行的(是的,很旧,我相信在某个地方有一个依赖关系阻碍了我们的更新尝试)。

    我认为这里发生的事情是,第一次绘制的尝试会产生一个错误,但到那时,它已经将计数绘制成数字。所以实际发生的是,我正在用 try 位,而比例由 except 比特。

    我怎样才能最好地解决这个问题,同时给学生提供他们不必修改的代码?

    0 回复  |  直到 5 年前
        1
  •  1
  •   ImportanceOfBeingErnest    5 年前

    哦,是的,你说得对。问题是函数签名 hist 允许关键字参数,并且只检查这些参数 之后 艺术家们已经被创造出来了。因此呼唤

    ax.hist(..., density=True)

    在一个版本中,它没有 density 参数,仍然会将其作为关键字参数传递,类似于如何传递任何艺术家属性,如颜色、线条样式等。

    这里唯一好的解决方案是 检查版本 直接使用,并根据情况使用以下任一参数:

    from distutils.version import LooseVersion
    import matplotlib
    import matplotlib.pyplot as plt
    import numpy as np
    
    N=1000
    sizes = [np.random.binomial(100, 0.03) for counter in range(N)]
    
    fig = plt.figure(1)
    main = plt.axes()
    
    if LooseVersion(matplotlib.__version__) >=  LooseVersion("2.1"):  
        hist_kw = dict(density=True)
    else:
        hist_kw = dict(normed=True)
    
    main.hist(sizes, bins = range(21), **hist_kw) 
    main.axis(ymax=0.4)
    plt.show()