【问题标题】:IPython automatically turning on matplotlib interactive modeIPython 自动开启 matplotlib 交互模式
【发布时间】:2019-07-22 21:15:20
【问题描述】:

我遇到了来自 IPython 的一些新奇的行为。我只需要重新安装我的 miniconda,所以我现在有了新的 IPython 和 Matplotlib 版本。事实证明,IPython 会自动将 matplotlib 切换到交互模式(这会产生烦人的副作用,即在我的脚本中使我保存的数字变为空白,因为它们会在我关闭窗口后保存)。

这是一个例子:

Python 3.7.3 | packaged by conda-forge | (default, Jul  1 2019, 21:52:21) 
Type 'copyright', 'credits' or 'license' for more information
IPython 7.6.1 -- An enhanced Interactive Python. Type '?' for help.

In [1]: import matplotlib as mpl                                                                                                                              

In [2]: import matplotlib.pyplot as plt                                                                                                                       

In [3]: mpl.is_interactive()                                                                                                                                  
Out[3]: False

In [4]: plt.plot([1,2])                                                                                                                                       
Out[4]: [<matplotlib.lines.Line2D at 0x7f0b0b048940>]

In [5]: mpl.is_interactive()                                                                                                                                  
Out[5]: True

有没有办法阻止这种行为?

注意,我已经在常规 python 中测试了相同的代码,并且交互模式保持关闭。

【问题讨论】:

  • 这是一个漫长的过程,但是检查你的 IPython .*rc 文件?它们可能没有被覆盖,因为(如果我没记错的话)它们位于您的主文件夹中的某个位置。
  • 图形需要交互模式才能响应,同时能够继续使用 IPython 控制台并更新绘图。因此,也许您想详细了解您在交互模式开启时遇到的问题?!​​
  • 我遇到了同样的问题。有趣的是,如果我在你的最后一行之后调用 plt.ioff() 然后再次调用 plt.figure() ,则交互不再打开。似乎是第一次调用 figure() 会打开交互模式的问题。
  • @ImportanceOfBeingErnest 当交互模式开启时,会弹出数字,绘制需要时间,当不想看到它们时很烦人,而是保存它们。

标签: python matplotlib ipython conda miniconda


【解决方案1】:

这是 matplotlib 和 IPython 之间相互作用的一个错误,它是在 matplotlib 版本 3.1.0 中引入的(通过#12637)。它将在 matplotlib 3.2 中修复(通过#14979)。

您的选择:

【讨论】:

    【解决方案2】:

    此版本的 ipython/matplotlib 的解决方法是定义自定义 ioff():

    import matplotlib.pyplot as plt
    import matplotlib as mpl
    
    def my_ioff():
      f = plt.figure()
      plt.close(f)
      plt.ioff()
    
    my_ioff()
    print(mpl.is_interactive())
    f = plt.figure()
    print(mpl.is_interactive())
    -----------
    -> False
    -> False
    
    

    而在我们之前:

    plt.ioff()
    print(mpl.is_interactive())
    f = plt.figure()
    print(mpl.is_interactive())
    -----------
    -> False
    -> True
    
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-25
      • 2021-05-03
      • 2013-11-28
      • 2010-12-28
      • 1970-01-01
      相关资源
      最近更新 更多