【问题标题】:Plot logarithmic axes with matplotlib in python在 python 中使用 matplotlib 绘制对数轴
【发布时间】:2010-10-20 21:40:59
【问题描述】:

我想使用 matplotlib 绘制具有一个对数轴的图形。

我一直在阅读文档,但无法弄清楚语法。我知道在情节参数中可能很简单,例如'scale=linear',但我似乎无法正确理解

示例程序:

import pylab
import matplotlib.pyplot as plt
a = [pow(10, i) for i in range(10)]
fig = plt.figure()
ax = fig.add_subplot(2, 1, 1)

line, = ax.plot(a, color='blue', lw=2)
pylab.show()

【问题讨论】:

    标签: python matplotlib scale logarithm


    【解决方案1】:

    您可以使用Axes.set_yscale 方法。这允许您在创建 Axes 对象后更改比例。这也将允许您构建一个控件,让用户在需要时选择比例。

    要添加的相关行是:

    ax.set_yscale('log')
    

    您可以使用'linear' 切换回线性刻度。您的代码如下所示:

    import pylab
    import matplotlib.pyplot as plt
    a = [pow(10, i) for i in range(10)]
    fig = plt.figure()
    ax = fig.add_subplot(2, 1, 1)
    
    line, = ax.plot(a, color='blue', lw=2)
    
    ax.set_yscale('log')
    
    pylab.show()
    

    【讨论】:

    • 这个方法很好,因为它适用于各种图(例如直方图),而不仅仅是“图”(这是 semilogx/semilogy 所做的)
    • 我来这里是为了寻找如何将轴用于二的幂:pylab.gca().set_xscale('log',basex=2)
    • Matplotlib 有semilogy()。此外,直接使用pyplot.yscale() 比使用ax.set_yscale('log') 更容易,因为不需要获取ax 对象(并不总是立即可用)。
    • 如果您想在两个轴上进行对数刻度,请尝试 loglog() 或仅在 x 轴上尝试 semilogx()
    • @EOL 我建议相反。最好使用显式的 ax 对象来使用 pyplot,它只可能应用于您想要的轴。
    【解决方案2】:

    首先,混合pylabpyplot代码不是很整洁。还有,pyplot style is preferred over using pylab

    这是一个稍微清理过的代码,仅使用pyplot 函数:

    from matplotlib import pyplot
    
    a = [ pow(10,i) for i in range(10) ]
    
    pyplot.subplot(2,1,1)
    pyplot.plot(a, color='blue', lw=2)
    pyplot.yscale('log')
    pyplot.show()
    

    相关函数为pyplot.yscale()。如果您使用面向对象的版本,请用方法Axes.set_yscale() 替换它。请记住,您还可以使用pyplot.xscale()(或Axes.set_xscale())更改X 轴的比例。

    查看我的问题What is the difference between ‘log’ and ‘symlog’? 以查看 matplotlib 提供的一些图形比例示例。

    【讨论】:

    • 很难弄清楚该怎么做。这个答案拯救了我的一天!
    • pyplot.semilogy() 更直接。
    【解决方案3】:

    您只需要使用 semilogy 而不是 plot:

    from pylab import *
    import matplotlib.pyplot  as pyplot
    a = [ pow(10,i) for i in range(10) ]
    fig = pyplot.figure()
    ax = fig.add_subplot(2,1,1)
    
    line, = ax.semilogy(a, color='blue', lw=2)
    show()
    

    【讨论】:

    • 大声笑,我一直在尝试 log(FloatArray),谢谢你拯救了我的一天
    • 还有semilogx。如果您需要同时登录两个轴,请使用 loglog
    【解决方案4】:

    如果要更改对数的底,只需添加:

    plt.yscale('log',base=2) 
    

    在 Matplotlib 3.3 之前,您必须使用 basex/basey 作为 log 的基础

    【讨论】:

      【解决方案5】:

      我知道这有点离题,因为一些 cmets 提到 ax.set_yscale('log') 是“最好的”解决方案,我认为可能需要反驳。我不建议将ax.set_yscale('log') 用于直方图和条形图。在我的版本(0.99.1.1)中,我遇到了一些渲染问题——不确定这个问题有多普遍。然而,bar 和 hist 都有可选参数来设置 y-scale 为 log,效果很好。

      参考: http://matplotlib.org/api/pyplot_api.html#matplotlib.pyplot.bar

      http://matplotlib.org/api/pyplot_api.html#matplotlib.pyplot.hist

      【讨论】:

        【解决方案6】:

        所以如果你只是像我经常使用的那样简单地使用简单的 API(我在 ipython 中经常使用它),那么这很简单

        yscale('log')
        plot(...)
        

        希望这对寻找简单答案的人有所帮助! :)。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-03-26
          • 1970-01-01
          相关资源
          最近更新 更多