0

我怀疑我以matplotlib某种错误的方式使用了交互功能,因为在使用以下代码和结构时,我必须在一个情节和下一个情节之间等待几秒钟。

我的数据库pandas DataFrame约为 (3800 x 56) float,具有 3-D 分层索引。

df = mydf.set_index(['l1','l2','l3'])

然后我继续创建matplotlib figureandaxes

fig = plt.figure()
ax = fig.add_subplot(111)
up_button_ax  = fig.add_axes([0.25, 0.15, 0.1, 0.03], facecolor='grey')
up_button= Button(up_button_ax, 'pga_up')
dn_button_ax  = fig.add_axes([0.25, 0.1, 0.1, 0.03], facecolor='grey')
dn_button= Button(dn_button_ax, 'pga_dn')

我很挣扎,Slider因为我希望它只接受整数,所以我最终选择了两个按钮,不得不使用一个小对象来保持它们的状态。

(不直接是我的问题,但欢迎任何建议是否有其他交互元素可以避免创建此对象)

class Index(object):
    ind = 0

    def next(self):
        self.ind += 1

    def prev(self):
        self.ind -= 1

callback = Index()

def up_button_on_clicked(mouse_event):
    callback.next()
    plot_data(callback.ind)
    print('up i: {}'.format(callback.ind))
up_button.on_clicked(up_button_on_clicked)

def dn_button_on_clicked(mouse_event):
    callback.prev()
    plot_data(callback.ind)
    print('dn i: {}'.format(callback.ind))
dn_button.on_clicked(dn_button_on_clicked)

def plot_data(i):        
    dfnow = df.xs(df.index.levels[0][i]) #slice by CMOD TUNE
    ax.clear()
    for c_pga in dfnow.index.levels[0]:
        if not(dfnow.xs(c_pga).empty):
            ax.plot(dfnow.xs(c_pga)['L1 (dBm)'],marker = 'o',markersize=1,label=c_pga)
    ax.set_title('CMOD TUNE: {}'.format(df.index.levels[0][i]))

执行后,每次单击按钮时,我都会立即看到打印输出,但必须等待很长时间才能最终绘制数据。

另一方面,如果我plot_data(i)从 shell 调用,绘图是立即的。因此,我假设我没有调用正确的绘图函数,但这里没有任何线索。

编辑

受第二次阅读 Joe_Kington关于离散的回复Slider的启发(感谢 Tom),我想在我的plot_data(i)函数中添加这个简单的行:

fig.canvas.draw()

绘图现在是即时的。如果有人能指出我需要这样做的原因,我仍然会很感激。

4

0 回答 0