我怀疑我以matplotlib
某种错误的方式使用了交互功能,因为在使用以下代码和结构时,我必须在一个情节和下一个情节之间等待几秒钟。
我的数据库pandas
DataFrame
约为 (3800 x 56) float
,具有 3-D 分层索引。
df = mydf.set_index(['l1','l2','l3'])
然后我继续创建matplotlib
figure
andaxes
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()
绘图现在是即时的。如果有人能指出我需要这样做的原因,我仍然会很感激。