Matplotlib画布绘制
问题描述:
比方说,我定义的一些功能做某些matplotlib
动作,如Matplotlib画布绘制
def dostuff(ax):
ax.scatter([0.],[0.])
现在,如果我启动ipython
,我可以加载这些功能,并开始一个新的数字:
In [1]: import matplotlib.pyplot as mpl
In [2]: fig = mpl.figure()
In [3]: ax = fig.add_subplot(1,1,1)
In [4]: run functions # run the file with the above defined function
如果我现在请dostuff
,那么这个数字不刷新:
In [6]: dostuff(ax)
我必须然后明确地运行:
In [7]: fig.canvas.draw()
要获取画布绘制。现在我可以修改dostuff为
def dostuff(ax):
ax.scatter([0.],[0.])
ax.get_figure().canvas.draw()
这将自动重新绘制画布。但现在,说我有以下代码:
def dostuff1(ax):
ax.scatter([0.],[0.])
ax.get_figure().canvas.draw()
def dostuff2(ax):
ax.scatter([1.],[1.])
ax.get_figure().canvas.draw()
def doboth(ax):
dostuff1(ax)
dostuff2(ax)
ax.get_figure().canvas.draw()
我可以调用每个函数,并在画布上会被重绘,但在doboth()
的情况下,它会得到重绘多次。
我的问题是:我怎么可以编码,这样canvas.draw()
只被调用一次?在上面的例子中,它不会有太大的变化,但是在更复杂的情况下,可以单独调用或分组的数十个函数,重复绘制更加明显,并且能够避免它。我想过使用装饰器,但它看起来并不简单。
任何想法?
答
为什么我对this SO question of yours关于“刷新修饰器”的回答使它变得简单?我准确地展示了你要做什么再次请求在这里(通过保持嵌套的计数 - 顺便说一下,也是线程安全的),并且你完全忽略了我的答案......特殊行为!) -
对于'重复'问题抱歉 - 我仍然想探索装饰者路线,但是它听起来很多评论,好像这会有点'错误',所以想看看是否有其他可能的解决方案。 – astrofrog 2010-03-27 23:39:53
iPython特定的方法可能是钩子,http://ipython.scipy.org/doc/manual/html/api/generated/IPython.core.hooks.html - 刷新例如在'pre_prompt_hook'中 - 但为什么强制你的代码只用iPython? – 2010-03-28 00:19:13