我怀疑我以错误的方式使用matplotlib
的交互式功能,因为在使用以下代码和结构时,我必须在一个绘图和下一个绘图之间等待几秒钟。
我的数据库是pandas
DataFrame
左右(3800 x 56)float
,带有3-D hyerachical索引。
df = mydf.set_index(['l1','l2','l3'])
然后我继续创建matplotlib
figure
和axes
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]))
执行后,每次单击按钮,我都会立即看到打印输出,但必须等待很长时间才能最终绘制数据。
另一方面,如果我从shell调用plot_data(i)
,则立即进行绘图。
因此,我假设我没有调用正确的绘图函数,但这里没有任何线索。
修改
受到离散Slider
的第二次读取Joe_Kington reply的启发(感谢Tom为此),我想到将这一简单的行添加到我的plot_data(i)
函数中:
fig.canvas.draw()
立即绘图。如果有人能指出我为什么需要这样做的原因,我仍会感激不尽。