【问题标题】:Draw connecting line to points with a zero ordinate on a log scale with matplotlib?使用matplotlib在对数刻度上绘制连接线到具有零纵坐标的点?
【发布时间】:2012-04-18 21:12:48
【问题描述】:

是否可以在 matplotlib 的对数刻度上将连接线绘制到 y 值为零的点?

我有一些数据要在 y 轴上用对数刻度绘制。一些数据的 y 值为零。我意识到 matplotlib 不可能在对数刻度上绘制这些点,但我真的希望它会从前一点或下一点(如果其中一个不为零)绘制连接线。

一种解决方案是简单地将所有零替换为一些 TINY 数字。我宁愿不这样做。

matplotlib 绘制的内容:

我想画什么:

【问题讨论】:

    标签: python matplotlib logarithm


    【解决方案1】:

    我希望通过在 y 轴上使用“symlog”选项而不是“log”来解决这个问题。然后有一个linthreshy arg 可以让您指定

    "绘图呈线性的范围(避免出现绘图 在零附近趋于无穷大)。”。

    事实上,该选项似乎旨在处理这类问题。在对数刻度图的底部有这个奇怪的线性区域可能看起来有点傻,但你可以让它变得非常小。

    【讨论】:

    • 完美!如果我只使用 symlog 选项,它工作正常,但由于某种原因,如果我尝试为 linthresy 指定一个参数,我会得到一个 TypeError: bad operand type for unary -: 'tuple'
    【解决方案2】:

    您总是可以通过从当前图形中提取坐标来在图形底部附加一个额外的点:

    import numpy as np
    import pylab as plt
    
    # Create some sample data like yours
    X = np.linspace(0,3,100)
    Y = np.exp(-X)
    
    def semilogy_to_bottom(X,Y):
        # Plot once to move axes and remove plot
        P, = plt.semilogy(X,Y)
        plt.gca().lines.remove(P)
    
        # Find the bottom of the graph
        y_min = plt.gca().get_ylim()[0]
    
        # Add a new point
        X2 = np.concatenate((X,[X[-1]]))
        Y2 = np.concatenate((Y,[y_min]))
        plt.semilogy(X2,Y2)
    
    semilogy_to_bottom(X,Y)
    plt.xlim(0,5)
    plt.show()
    

    【讨论】:

      猜你喜欢
      • 2021-02-05
      • 2018-08-24
      • 2014-04-01
      • 1970-01-01
      • 2013-11-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-22
      相关资源
      最近更新 更多