繁体   English   中英

如何为 Jupyter notebook 中的函数临时(本地)更改 Matplotlib 后端,而不影响全局后端?

[英]How to change Matplotlib backend temporarily (locally) for a function in Jupyter notebook, wihout affecting the backend globally?

  • 目标:

我正在编写一个在 Jupyter 笔记本中使用Qt5Agg后端的函数。 笔记本的其余部分主要使用inline 该函数生成一个带有 matplotlib 小部件的交互式绘图,我想让它在单独的窗口中工作。 笔记本的其余部分会生成一堆数字,有时在单个单元格中生成数百个数字,这些数字必须内联生成,以提高效率。

我一直在运行%matplotlib qt之前运行该函数,并在运行该函数后立即%matplotlib inline 但是,我不想打扰这两行,特别是因为%matplotlib inline必须在单独的单元格中运行。 它很容易出现用户错误 - 如果用户忘记运行该单元,后端将卡在 Qt5Agg 中。

我想通过在函数中添加一些代码来临时更改后端。 这将具有使此功能更加兼容的额外优势。 我可以将它转移到其他笔记本,它会按预期工作,使用 Qt5Agg,并且不会干扰该笔记本其余部分使用的任何后端(内联或其他)。

请注意,我在 Windows 上编码,但我必须确保笔记本电脑在所有操作系统上都能正常工作。

  • 到目前为止我尝试过的:

我能想到的最明显的解决方案是使用装饰器设置临时 rc 上下文...

@plt.rc_context({'backend': 'Qt5Agg'})
def function(foo):
    ...
    return None

正如预期的那样,这为后端设置了上下文,但 Matplotlib 不使用它! 如果我从函数内部打印后端,它会告诉我它是 Qt5Agg,而我正盯着它下面的内联图。 使用rc_context可以有效地更改其他参数。 我可以轻松更改诸如'lines.linestyle''lines.linestyle'并且情节将反映这些更改。 只有在后端,Matplotlib 拒绝使用我设置的值。

接下来,我尝试更改rcParams字典中的'backend'值(这将全局更改后端,而不是本地更改,但我还是尝试了)。 它导致了类似的情况,即字典中的值发生了变化,但 Matplotlib 继续使用内联后端。 我也尝试使用switch_backendmatplotlib.use ,但它们都没有可靠地工作。 此外,它们还应该全局更改后端,因此不适合我的使用。 到目前为止,我发现的所有方法中,魔术是正确更改后端的唯一方法。

  • 概括:
  1. 我无法让 Matplotlib 在不使用魔法的情况下可靠地更改后端。
  2. Magic 全局设置后端,而不是在函数中本地设置。
  3. 我需要在本地更改后端,只有一个功能。
  4. Matplotlib 不会使用rc_context的后端。

PS - 这是我的第一篇文章,如果我没有提供所有有用的信息,请见谅。 如果您需要更多信息,请告诉我。

我发现切换到 PyQt 并返回到内联的最佳方法是通过mpl_connect'close_event' 这是我所做的概述:

def function(foo):
    #Switches to qt interactive backend
    %matplotlib qt
    ...
    fig = plt.figure(...)
    ...
    def on_close(event):
        %matplotlib inline
    fig.canvas.mpl_connect('close_event', on_close) #Switches backend to inline when the figure closes
    ...
    return None

它在我的 Windows 机器上完美运行。 我可以使用默认的关闭按钮关闭图形窗口,或者使用 Matplotlib 小部件传递plt.close() 在这两种情况下,后端都切换回内联。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM