python循环生成的多个数字,但仅在循环结束后绘制

时间:2016-06-05 12:18:06

标签: python loops matplotlib plot iteration

我有以下代码,它采用对象列表,并且每个对象从存储在对象中的数据中绘制图形:

def Plot(self, *figures , wait = True):


    def plot(fig,n):
        fig.fig = plt.figure(n)
        print("Ploting figure {} for file {}\n".format(n,fig.name))
        fig.Plot()
        plt.show()
        if wait:
            input("Press Enter to continue to next figure")

    if not figures:
        figures = self.figures            
        for n,fig in figures.items():
            plot(fig,n)
    else:
        for n,fig in enumerate(figures):
            plot(fig,n)

fig.Plot()是处理绘图的函数。运行' Plot'时,会在循环的每次迭代中生成一个数字,但实际绘图仅在循环结束后才会生成。

我想要实现的是,在每次迭代时,生成图形并绘制绘图,然后再继续下一次迭代。

1 个答案:

答案 0 :(得分:0)

经过一些谷歌搜索后,我找到了一个解决方案:physicalmodelingwithpython.blogspot.co.il/2015/07 / ...其中的行:“if wait:input(”按Enter继续下一个数字“)”应该被替换with:“while True:if plt.waitforbuttonpress():break”

plt.waitforbuttonpress()返回True是按键是按下,如果按下鼠标按钮则返回False,允许在函数中停止循环并返回控制台。

我添加了关键字'Startat',以便稍后从列表中的下一个图中恢复(这也可以通过合适的装饰器完成)。

可以使用python事件处理例程来实现更优雅的解决方案,其中我和John Snow一样了解。

完整功能(某些关键字与原始问题无关):

def Plot(self, figures=None, wait=True, Save=False, Legendtitle=False, Startat=0):

    def plot(fig, n):

        print("Ploting figure {} for file {}\n".format(n, fig.name))
        fig.Plot(Legendtitle)
        if Save:
            fig.SavePlot()   
        if wait:    
            while True:
                if plt.waitforbuttonpress():
                    break
                else:
                    return True


    if not figures:
        figures = self.figures
        for n, fig in figures.items(): 
            if n>= Startat:                   
                if plot(fig, n):
                    break


    else:
        for n, fig in enumerate(figures):
            if n>= Startat:
                if plot(fig, n):
                    break