将网格线设置为保持在Matplotlib

时间:2017-05-23 16:18:21

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

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

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

对于视觉参考,添加一个虚线以突出显示0%" Base"每张附图线。为了说明,此问号由[7]为此问题指定:

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

随着时间序列的进展,Y轴将随着minY和maxY限制不断更新而改变。如果范围(minY,maxY)并不总是关于0%"基数"那么我如何设置短划线始终保持在特定的0%刻度点。线?

ASX-IndexASX-20170519

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分: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()

enter image description here