【问题标题】:Set grid line to stay at a specific tick point in a variable Y-Axis in Matplotlib在 Matplotlib 的变量 Y 轴中设置网格线以保持在特定刻度点
【发布时间】:2017-10-23 17:19:38
【问题描述】:

在绘制时间序列时,Y 轴定义为:

yAxis = np.arange(minY, maxY, stepY)
ax.set_ylim(minY, maxY)
ax.set_yticks(yAxis)

为了视觉参考,添加了一条虚线以突出显示每个附加图表的 0%“基准”线。为了说明,这个虚线是由 [7] 为这个问题指定的:

yGrid = ax.get_ygridlines()
yBase = yGrid[7]
yBase.set_linestyle('--')

随着时间序列的推进,Y 轴会随着 minY 和 maxY 限制的不断更新而变化。鉴于 range(minY, maxY) 并不总是关于 0%“基准”线对称,我如何将虚线设置为始终保持在特定的 0% 刻度点?

【问题讨论】:

    标签: python-3.x matplotlib time-series


    【解决方案1】:

    当然,在零网格线的顶部添加一条附加线是最简单的解决方案。正如汤姆所指出的,这可以使用ax.axhline(0) 来完成。

    缺点可能是axhline 下方的网格线仍然存在。

    回答实际问题:您可以检查哪条网格线是位于零位置的网格线,并为该网格线设置线型。

    import matplotlib.pyplot as plt
    import matplotlib.animation
    import numpy as np; np.random.seed(1)
    
    x = np.arange(0,99)
    y = np.cumsum(np.random.normal(loc=0.1, size=len(x)))
    
    fig, ax = plt.subplots()
    
    line, = ax.plot([],[], color="plum", lw=2)
    ax.grid(color="lightgray", lw=2)
    
    def update_gridline(pos):
        yGrid = ax.get_ygridlines()
        for i, gl in enumerate(yGrid):
            y  = gl.get_ydata()
            if y[0]==pos:
                gl.set_linestyle('--')
                gl.set_color('crimson')
            else:
                gl.set_linestyle('-')
                gl.set_color("lightgray")
    
    def update(i):
        line.set_data(x[:i],y[:i])
        ax.relim()
        ax.autoscale_view()
        update_gridline(0)
    
    
    ani = matplotlib.animation.FuncAnimation(fig, update, frames=100, interval=100)
    plt.show()
    

    【讨论】:

    • 感谢 IOBE,这是对动画的真诚回应!太棒了!
    【解决方案2】:

    您可以使用axhline 在该点绘制另一条线,而不是修改其中一条网格线,它将始终保持在您给它的 y 位置:

    ax.axhline(0, linestyle='--')
    

    【讨论】:

    • 感谢 Tom 提供快速而直接的解决方案!
    猜你喜欢
    • 2011-03-29
    • 1970-01-01
    • 1970-01-01
    • 2021-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-01
    • 1970-01-01
    相关资源
    最近更新 更多