【问题标题】:Matplotlib canvas drawingMatplotlib 画布绘图
【发布时间】:2011-02-01 15:30:06
【问题描述】:

假设我定义了一些函数来执行某些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() 只会被调用一次?在上面的例子中它不会有太大变化,但是在更复杂的情况下,有几十个函数可以单独调用或分组调用,重复绘制更加明显,能够避免它会很好。我想过使用装饰器,但看起来并不简单。

有什么想法吗?

【问题讨论】:

    标签: python algorithm matplotlib


    【解决方案1】:

    为什么我对this SO question of yours 关于“刷新装饰器”的回答不让它变得简单?我准确地展示了您在此处再次要求做什么(通过保持嵌套计数——顺便说一句,嵌套也是线程安全的),而您完全忽略了我的回答……奇怪的行为! -)

    【讨论】:

    • 对不起'重复'问题-我仍然想探索装饰器路线,但是从许多 cmets 听起来好像这会以某种方式'错误',所以想看看是否还有其他可能解决方案。
    • 特定于 iPython 的方法可能是钩子,ipython.scipy.org/doc/manual/html/api/generated/… -- 刷新例如在pre_prompt_hook 中——但为什么要强制你的代码只支持 iPython?
    猜你喜欢
    • 1970-01-01
    • 2013-04-10
    • 2021-12-27
    • 1970-01-01
    • 2020-07-10
    • 2017-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多