当我在 jupyter notebook 中使用 matplotlib 时,它总是引发“matplotlib 当前正在使用非 GUI 后端”错误?

Posted

技术标签:

【中文标题】当我在 jupyter notebook 中使用 matplotlib 时,它总是引发“matplotlib 当前正在使用非 GUI 后端”错误?【英文标题】:When I use matplotlib in jupyter notebook,it always raise " matplotlib is currently using a non-GUI backend" error? 【发布时间】:2016-09-18 19:42:09 【问题描述】:
import matplotlib.pyplot as pl
%matplot inline
def learning_curves(X_train, y_train, X_test, y_test):
""" Calculates the performance of several models with varying sizes of training data.
    The learning and testing error rates for each model are then plotted. """

print ("Creating learning curve graphs for max_depths of 1, 3, 6, and 10. . .")

# Create the figure window
fig = pl.figure(figsize=(10,8))

# We will vary the training set size so that we have 50 different sizes
sizes = np.rint(np.linspace(1, len(X_train), 50)).astype(int)
train_err = np.zeros(len(sizes))
test_err = np.zeros(len(sizes))

# Create four different models based on max_depth
for k, depth in enumerate([1,3,6,10]):

    for i, s in enumerate(sizes):

        # Setup a decision tree regressor so that it learns a tree with max_depth = depth
        regressor = DecisionTreeRegressor(max_depth = depth)

        # Fit the learner to the training data
        regressor.fit(X_train[:s], y_train[:s])

        # Find the performance on the training set
        train_err[i] = performance_metric(y_train[:s], regressor.predict(X_train[:s]))

        # Find the performance on the testing set
        test_err[i] = performance_metric(y_test, regressor.predict(X_test))

    # Subplot the learning curve graph
    ax = fig.add_subplot(2, 2, k+1)

    ax.plot(sizes, test_err, lw = 2, label = 'Testing Error')
    ax.plot(sizes, train_err, lw = 2, label = 'Training Error')
    ax.legend()
    ax.set_title('max_depth = %s'%(depth))
    ax.set_xlabel('Number of Data Points in Training Set')
    ax.set_ylabel('Total Error')
    ax.set_xlim([0, len(X_train)])

# Visual aesthetics
fig.suptitle('Decision Tree Regressor Learning Performances', fontsize=18, y=1.03)
fig.tight_layout()
fig.show()

当我运行learning_curves() 函数时,它显示:

UserWarning:C:\Users\Administrator\Anaconda3\lib\site-packages\matplotlib\figure.py:397: UserWarning: matplotlib 当前使用的是非 GUI 后端,所以无法显示图

【问题讨论】:

你使用的是什么版本的 matplotlib?你可以通过import matplotlibprint(matplotlib.__version__)查看 1.5.1 ,最新版本。 添加“%pylab inline”对我有用。 没有一个解决方案对我有用。 Matplotlib 3.0.3 版。 如果您仅将 Jupyter 用于编码而不用于生产,请忽略它。它会在 Jupyter 之外消失 【参考方案1】:

你不需要“fig.show()”这行。只需将其删除。然后它将没有警告消息。

【讨论】:

不会有警告信息,但是会看到这个数字。我正在研究 Pycharm,当没有 fig.show() 执行时,它甚至不显示绘图。请问有什么办法? 如果绘图是笔记本单元格中的最后一个对象,那么 jupyter 会尝试渲染它。如果您有多个绘图或更多输出,并排除fig.show()s,那么您将看不到您的图形。 换句话说,一种选择是简单地将最后一行设为fig beforelongbefore 使用IPython.display 的答案更好,因为它适用于每个单元格的多个数字。【参考方案2】:

您可以通过以下方式更改 matplotlib 使用的后端:

import matplotlib
matplotlib.use('TkAgg')

之前你的第 1 行 import matplotlib.pyplot as pl,因为它必须首先设置。请参阅this answer 了解更多信息。

(还有其他后端选项,但是当我遇到类似问题时,将后端更改为 TkAgg 对我有用)

【讨论】:

【参考方案3】:

用https://matplotlib.org/examples/animation/dynamic_image.html测试我只是添加

%matplotlib notebook

这似乎可行,但有点颠簸。我不得不时不时地停止内核:-(

【讨论】:

%matplotlib notebook 提供交互式、可平移和可缩放的图表。 这对我有用!谢谢!我只需要用于验证目的,不需要生产中的图表,所以它对我有用。【参考方案4】:

我试图制作类似于Towards Data Science Tutorial 的 3d 聚类。我首先认为fig.show() 可能是正确的,但得到了同样的警告...... 简要查看了Matplot3d.. 但后来我尝试了plt.show(),它完全按照预期显示了我的 3d 模型。我想这也是有道理的。 这相当于你的pl.show()

使用 python 3.5 和 Jupyter Notebook

【讨论】:

您能否编辑您的答案以解释如何解决问题,而不是解释您经历的过程?您还应该考虑查看how to answer 的文章以备不时之需:)【参考方案5】:

在导入时添加 %matplotlib inline 有助于在笔记本中平滑绘图

%matplotlib inline
import matplotlib.pyplot as plt

%matplotlib inline 将 matplotlib 的后端设置为“内联”后端: 使用这个后端,绘图命令的输出会在 Jupyter 笔记本等前端内联显示,直接在生成它的代码单元下方。然后,生成的图也将存储在笔记本文档中。

【讨论】:

这尤其适用于 PyCharm 2019.1+ 中的新 jupyter 实现 谢谢。在安装和使用熊猫分析图形后,我遇到了问题。使用 "%matplotlib inline" 解决了我的 jupyter notebook 的问题。【参考方案6】:

如果您正在使用任何分析库,例如 pandas_profiling,请尝试注释掉它们并执行代码。在我的例子中,我使用 pandas_profiling 为样本训练数据生成报告。注释掉 import pandas_profiling 帮助我解决了我的问题。

【讨论】:

【参考方案7】:

%matplotlib 笔记本对我有用。

但加载需要时间,但很清楚。

【讨论】:

您应该尝试给出一个解决问题或有助于解决问题的答案。像这样的一般反应对 OP 没有帮助。【参考方案8】:

我有同样的错误。然后我用

import matplotlib matplotlib.use('WebAgg')

它工作正常。(你必须安装龙卷风才能在网络上查看,(pip install tornado))

Python 版本:3.7 matplotlib 版本:3.1.1

【讨论】:

【参考方案9】:

当我尝试使用命令 fig.show() 显示绘图时,也出现错误“matplotlib 当前使用非 GUI 后端”。我发现在 Jupyter Notebook 中,命令 fig, ax = plt.subplots() 和绘图命令需要在同一个单元格中才能渲染绘图。

例如,以下代码将在 Out[5] 中成功显示条形图:

在[3]中:

import matplotlib.pyplot as plt
%matplotlib inline

在[4]中:

x = 'A B C D E F G H'.split()
y = range(1, 9)

在[5]中:

fig, ax = plt.subplots()
ax.bar(x, y)

Out[5]:(8 个艺术家的容器对象)

A successful bar plot output

另一方面,下面的代码不会显示情节,

在[5]中:

fig, ax = plt.subplots()

输出[5]:

An empty plot with only a frame

在[6]中:

ax.bar(x, y)

Out[6]:(8 个艺术家的容器对象)

在Out[6]中只有“8位艺术家的容器对象”的声明,但没有显示条形图。

【讨论】:

【参考方案10】:

你仍然可以通过 fig.savefig() 保存图形

如果你想在网页上查看,可以试试

from IPython.display import display
display(fig)

【讨论】:

这行得通,就像上面的评论一样,只使用fig 作为单元格的最后一行 对,但是这个更好,因为它可以在一个单元格中处理多个数字。【参考方案11】:

只需输入fig 而不是fig.show()

【讨论】:

【参考方案12】:

您将 matplotlib.pyplot 导入为 pl。最后输入 pl.show() 而不是 fig.show()

【讨论】:

以上是关于当我在 jupyter notebook 中使用 matplotlib 时,它总是引发“matplotlib 当前正在使用非 GUI 后端”错误?的主要内容,如果未能解决你的问题,请参考以下文章

当我的 jupyter notebook 越来越大时,VScode ssh 连接中断

访问在 Docker 容器上运行的 Jupyter notebook

使用jupyter notebook时导入文件时出错

Jupyter Notebook 无法访问 Bigquery

当我使用内联 sql 魔术时,jupyter notebook pyspark sparkmagic 错误

在 Jupyter Notebook 中执行高斯朴素贝叶斯时出错