6

我正在尝试按如下方式更新 matplotlib 图:

import matplotlib.pyplot as plt
import matplotlib.dates as mdate
import numpy as np

plt.ion()

fig = plt.figure()
ax = fig.add_subplot(111)

for i,(_,_,idx) in enumerate(local_minima):
    dat = dst_data[idx-24:idx+25]
    dates,values = zip(*dat)
    if i == 0:
        assert(len(dates) == len(values))
        lines2d, = ax.plot_date(mdate.date2num(dates), np.array(values), linestyle='-')
    else:
        assert(len(dates) == len(values))
        lines2d.set_ydata(np.array(values))
        lines2d.set_xdata(mdate.date2num(dates))  #This line causes problems.

        fig.canvas.draw()
    raw_input()

第一次通过循环,情节显示得很好。第二次通过循环,我的情节上的所有数据都消失了——如果我不包括这lines2d.set_xdata条线,一切都很好(当然除了 x 数据点是错误的)。我看过以下帖子:

如何更新 matplotlib 中的绘图?

更新 matplotlib 中的行

但是,在这两种情况下,用户都只更新了ydata,我也想更新xdata

4

1 回答 1

6

就像典型的案例一样,写下一个问题的行为激发了我去研究一种我以前没有想到的可能性。x 数据正在更新,但绘图范围未更新。当我将新数据放在图上时,一切都超出了范围。解决方案是添加:

ax.relim()
ax.autoscale_view(True,True,True)

(部分参考)


这是原始问题上下文中的代码,希望有一天对其他人有所帮助:

import matplotlib.pyplot as plt
import matplotlib.dates as mdate
import numpy as np

plt.ion()

fig = plt.figure()
ax = fig.add_subplot(111)

for i,(_,_,idx) in enumerate(local_minima):
    dat = dst_data[idx-24:idx+25]
    dates,values = zip(*dat)
    if i == 0:
        assert(len(dates) == len(values))
        lines2d, = ax.plot_date(mdate.date2num(dates), np.array(values), linestyle='-')
    else:
        assert(len(dates) == len(values))
        lines2d.set_ydata(np.array(values))
        lines2d.set_xdata(mdate.date2num(dates))  #This line causes problems.
        ax.relim()
        ax.autoscale_view(True,True,True)
        fig.canvas.draw()
    raw_input()
于 2012-10-28T03:45:24.860 回答