【问题标题】:How to change Matplotlib backend temporarily (locally) for a function in Jupyter notebook, wihout affecting the backend globally?如何在不影响全局后端的情况下临时(本地)更改 Jupyter 笔记本中的函数的 Matplotlib 后端?
【发布时间】:2021-12-07 23:59:19
【问题描述】:
  • 目标:

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

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

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

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

  • 到目前为止我所做的尝试:

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

import matplotlib.pyplot as plt

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

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

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

  • 总结:
  1. 如果不使用魔法,我无法让 Matplotlib 可靠地更改后端。
  2. Magic 全局设置后端,而不是函数内的本地设置。
  3. 我需要在本地更改后端,只有一个功能。
  4. Matplotlib 不会使用来自rc_context 的后端。

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

【问题讨论】:

    标签: python matplotlib jupyter-notebook ipython jupyter


    【解决方案1】:

    我发现切换到 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()。在这两种情况下,后端都会切换回内联。

    【讨论】:

      猜你喜欢
      • 2016-02-16
      • 2022-06-22
      • 2021-12-27
      • 1970-01-01
      • 2016-07-19
      • 2018-06-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多