【问题标题】:"UserWarning: Matplotlib is currently using agg, which is a non-GUI backend, so cannot show the figure." when plotting figure with pyplot on Pycharm“用户警告:Matplotlib 当前使用的是 agg,这是一个非 GUI 后端,因此无法显示该图。”在 Pycharm 上用 pyplot 绘制图形时
【发布时间】:2019-11-01 13:12:51
【问题描述】:

我正在尝试使用 pyplot 绘制一个简单的图形,例如:

import matplotlib.pyplot as plt
plt.plot([1,2,3],[5,7,4])
plt.show()

但该图没有出现,我收到以下消息:

UserWarning: Matplotlib is currently using agg, which is a non-GUI backend, so cannot show the figure.

我在几个地方看到必须使用以下命令更改 matplotlib 的配置:

import matplotlib
matplotlib.use('TkAgg')
import matplotlib.pyplot as plt

我这样做了,但随后收到一条错误消息,因为它找不到模块:

ModuleNotFoundError: No module named 'tkinter'

然后,我尝试使用pip install tkinter(在虚拟环境中)安装“tkinter”,但没有找到:

Collecting tkinter
  Could not find a version that satisfies the requirement tkinter (from versions: )
No matching distribution found for tkinter

我还应该提到,我使用虚拟环境在 Pycharm 社区版 IDE 上运行所有这些,并且我的操作系统是 Linux/Ubuntu 18.04。

我想知道如何解决这个问题以便能够显示图表。

【问题讨论】:

  • 暂时忘记图表。您的问题是安装 tkinter。您是否尝试过任何可用的解决方案,例如stackoverflow.com/questions/4783810/install-tkinter-for-python ?
  • 您实际上是在使用 tkinter 做任何事情,还是只是选择它作为 plt 后端?
  • @ImportanceOfBeingErnest:感谢您的提示。我确实会首先专注于安装 tkinter。我会看看你提供的链接,看看我能不能从中得到什么。
  • @G.Anderson:在使用 matplotlib 遇到此错误之前,我不知道 tkinter 是什么。现在我正在尝试安装它只是为了能够显示图表(所以是的,我想我只是选择它作为 plt 后端)。如果您知道任何其他方式(即不使用 tkinter),我会很高兴听到它。
  • @G.Anderson:我运行脚本来循环浏览不同的后端。事实证明,只有 TkAgg 可用!事实上,我在测试脚本之前刚刚安装了它。

标签: python matplotlib pycharm


【解决方案1】:

跑步 %matplotlib 内联 一旦为我解决了问题。 我在这里找到了答案:When I use matplotlib in jupyter notebook,it always raise " matplotlib is currently using a non-GUI backend" error? 作者:Mulugeta Weldezgina

在导入时添加 %matplotlib inline 有助于在 笔记本

%matplotlib inline
import matplotlib.pyplot as plt

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

在我使用 pandas_profile(或类似的东西)并运行 %matplotlib inline 后,我的问题开始了,一旦修复了背景无头等问题。

【讨论】:

    【解决方案2】:

    在带有 X 服务器的 WSL 上

    确保您的 X 服务器正常工作。如果他无法连接到 X 显示器,Matplotlib 会指出此错误。

    Windows 防火墙配置

    注意windows防火墙!我从 WSL Debian 更改为 Ubuntu,但不记得防火墙规则。 我使用this post 配置windows 防火墙规则以使X 服务器正常工作。这种方法避免了任何人都可以使用您的 X 服务器的过于宽松的规则。

    上面写着:

    如果您已经安装了 X11 服务器,Windows 可能已经创建了会与上述配置混淆的防火墙规则。在“具有高级安全性的 Windows Defender 防火墙”中搜索并删除它们。

    您现在需要配置 Windows 防火墙以允许从 WSL2 连接到 X11 显示服务器。您将在下一步中安装显示服务器。我们首先执行此步骤以避免 Windows 防火墙在您运行 X11 显示服务器时自动创建不安全的防火墙规则。许多关于 X11 转发和 WSL2 的指南都使此防火墙规则过于宽松,允许从任何计算机连接到您的计算机。这意味着理论上有人可以在您的同一网络上开始向您的计算机发送图形显示信息。

    为避免这种情况,我们将让 Windows 防火墙仅接受来自 WSL2 实例的互联网流量。

    要进行此设置,您可以将以下内容复制到脚本并从 WSL2 中运行它:

    #!/bin/sh
    LINUX_IP=$(ip addr | awk '/inet / && !/127.0.0.1/ {split($2,a,"/"); print a[1]}')
    WINDOWS_IP=$(ip route | awk '/^default/ {print $3}')
    # Elevate to administrator status then run netsh to add firewall rule
    powershell.exe -Command "Start-Process netsh.exe -ArgumentList \"advfirewall firewall add rule name=X11-Forwarding dir=in action=allow program=%ProgramFiles%\VcXsrv\vcxsrv.exe localip=$WINDOWS_IP remoteip=$LINUX_IP localport=6000 protocol=tcp\" -Verb RunAs"
    

    手动方法:

    或者,您可以通过执行以下操作通过 GUI 手动添加规则:

    1. 打开“具有高级安全性的 Windows Defender 防火墙”
    2. 单击添加新规则将打开新规则向导(在每个部分之间导航旁边):
      • 规则类型:自定义
      • 程序:“此程序路径:”%ProgramFiles%\VcXsrv\vcxsrv.exe
      • 协议和端口
      • 协议类型:TCP
      • 本地端口:6000
      • 远程端口:任意
      • 范围
        • 本地 IP 地址:通过在 WSL2 中运行以下命令获取要放入的 IP 地址 ip route | awk '/^default/ {print $3}'
      • 远程 IP 地址
        • 通过在 WSL2 中运行以下命令获取要输入的 IP 地址 ip addr | awk '/inet / && !/127.0.0.1/ {split($2,a,"/"); print a[1]}'
      • 操作:“允许连接
      • 配置文件:选择域、私有和公共
      • 名称:“X11 转发”

    【讨论】:

    • 虽然此链接可能会回答问题,但最好在此处包含答案的基本部分并提供链接以供参考。如果链接页面发生更改,仅链接答案可能会失效。 - From Review
    猜你喜欢
    • 2022-11-10
    • 2020-06-28
    • 2022-12-01
    • 2019-08-21
    • 2020-01-08
    • 1970-01-01
    • 2019-06-16
    • 2020-04-30
    • 1970-01-01
    相关资源
    最近更新 更多