我有一个for循环,我在其中创建并显示一个matplotlib图。我还有一个嵌套函数(def onClick),它可以处理当我点击图形时会发生什么。
E.g。
for i in list:
fig, ax = plt.subplots(1)
plt.plot(data)
def onClick(event):
#doSomething = True
cid = fig.canvas.mpl_connect('button_press_event', onclick)
plt.show()
我希望能够在6次点击后继续for循环到下一次迭代。我不能将continue语句放在onClick函数中,因为它不是for循环的一部分。
任何帮助都将不胜感激。
答案 0 :(得分:1)
首先,plt.show()被调用一次(参见here on Stackoverflow和here on the Matplotlib mailing list)。这简直就是如何使用Matplotlib。你准备你的情节,然后plt.show()是脚本中的最后一行。
但是,如果我们想展示并与多个情节互动怎么办?诀窍是提前准备图表,并在结束时仍然调用plt.show()一次。以下是使用代码中的onclick事件的示例。它循环几个图,然后在结束时停止。您必须稍微重新排列代码以保存for循环中发生的任何结果。
import numpy as np
import matplotlib.pyplot as plt
# prepare some pretty plots
stuff_to_plot = []
for i in range(10):
stuff_to_plot.append(np.random.rand(10))
fig = plt.figure()
ax = fig.add_subplot(111)
coord_index = 0
plot_index = 0
def onclick(event):
# get the index variables at global scope
global coord_index
if coord_index != 6:
print 'button=%d, x=%d, y=%d, xdata=%f, ydata=%f'%(
event.button, event.x, event.y, event.xdata, event.ydata)
coord_index += 1
else:
coord_index = 0
global plot_index
# if we have more to plot, clear the plot and plot something new
if plot_index < len(stuff_to_plot):
plt.cla()
ax.plot(stuff_to_plot[plot_index])
plt.draw()
plot_index += 1
cid = fig.canvas.mpl_connect('button_press_event', onclick)
# plot something before fist click
ax.plot(stuff_to_plot[plot_index])
plot_index += 1
plt.show()