当我在jupyter笔记本中使用matplotlib时,它总是会提升" matplotlib目前正在使用非GUI后端"错误?

时间:2016-05-21 16:19:36

标签: python matplotlib jupyter-notebook

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后端,因此无法显示图

this is the screenshot

12 个答案:

答案 0 :(得分:42)

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

答案 1 :(得分:16)

您可以通过包含:

来更改matplotlib使用的后端
import matplotlib
matplotlib.use('TkAgg')

之前第1行import matplotlib.pyplot as pl,因为必须先设置它。有关详细信息,请参阅this answer

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

答案 2 :(得分:11)

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

%matplotlib inline
import matplotlib.pyplot as plt

%matplotlib inline将matplotlib的后端设置为'inline'后端: 有了这个后端,绘图命令的输出就在Jupyter笔记本之类的前端内联显示,就在生成它的代码单元正下方。生成的图也将存储在笔记本文档中。

答案 3 :(得分:4)

使用https://matplotlib.org/examples/animation/dynamic_image.html进行测试我只需添加

%matplotlib notebook

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

答案 4 :(得分:4)

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

答案 5 :(得分:3)

您仍然可以通过fig.savefig()保存该图

如果要在网页上查看,可以尝试

from IPython.display import display
display(fig)

答案 6 :(得分:2)

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

使用python 3.5和Jupyter Notebook

答案 7 :(得分:0)

如果您正在使用任何配置文件库(例如pandas_profiling),请尝试将它们注释掉并执行代码。就我而言,我正在使用pandas_profiling生成样本火车数据的报告。注释掉import pandas_profiling可以帮助我解决问题。

答案 8 :(得分:0)

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

{ "transactions": [ { "id": 1, "product": { "id": 1, "name": "Bottle", "code": "B1", "price": 50000 }, "qty": 1, "price": 50000 }, { "id": 2, "product": { "id": 2, "name": "Cable", "code": "C1", "price": 20000 }, "qty": 1, "price": 20000 } ] }

它工作正常。(您必须安装龙卷风才能在网络中查看(import matplotlib matplotlib.use('WebAgg')

答案 9 :(得分:0)

当我尝试使用命令fig.show()显示绘图时,也会发生错误“ matplotlib当前正在使用非GUI后端”。我发现在Jupyter Notebook中,命令fig, ax = plt.subplots()并且plot命令必须位于同一单元格中才能渲染图。

例如,以下代码将成功显示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 :(得分:-1)

%matplotlib笔记本为我工作。

但是加载需要时间,但是很明显。

答案 11 :(得分:-2)

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