matplotlib中plot.show()不显示图片的问题:如何把backend=Agg配置为TkAgg

2024-03-15 22:58

本文主要是介绍matplotlib中plot.show()不显示图片的问题:如何把backend=Agg配置为TkAgg,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

关于matplotlib不显示的问题,碰到过多次,貌似是默认安装使用anaconda时都会碰到,不知道matplotlib为什么一直不解决这个问题。所以记录一下。

默认情况下,matplotlib的backend使用的是agg,或template,此时是无法显示图片的,agg库不支持。

好奇的可以查一下自己的配置文件,如

>>> import matplotlib
>>> matplotlib.matplotlib_fname()
C:\Users\Administrator\.matplotlib\matplotlibrc
也可以使用下面的命令打印出配置,
print(mpl.get_backend())
# it will display Agg if you have a display problem, or otherwise TkAgg etc.
print(mpl.matplotlib_fname())
# it will display the setting file location, e.g.
# C:\Users\Administrator\.matplotlib\matplotlibrc
# the content is simple: "backend      : Agg", just change it to "backend      :TkAgg"

 

解决办法:

先把自己版本所支持的backends打印出来看一下,

>>>import matplotlib.rcsetup as rcsetup
>>>print(rcsetup.all_backends)
['GTK3Agg', 'GTK3Cairo', 'MacOSX', 'nbAgg', 'Qt4Agg', 'Qt4Cairo', 'Qt5Agg', 'Qt5Cairo', 'TkAgg', 'TkCairo', 'WebAgg', 'WX', 'WXAgg', 'WXCairo', 'agg', 'cairo', 'pdf', 'pgf', 'ps', 'svg', 'template']

例如,把配置文件

C:\Users\Administrator.matplotlib\matplotlibrc

的内容改成正面的情况:

backend      : TkAgg

一般图片就能正常显示了,当然你也可以不停尝试下其他的backends,像有些backends是需要安装 其他支持包的,如cairo。

linux上解决办法也是相同的,只不过配置文件的位置不一样。

 

给几个有用的参考:

https://stackoverflow.com/questions/2130913/no-plot-window-in-matplotlib

https://stackoverflow.com/questions/7534453/matplotlib-does-not-show-my-drawings-although-i-call-pyplot-show

 

附评论里的问题:确定配置为TkAgg,但是在import matplotlib.pyplot as plt之后所显示的终端为agg

这种现象的主要原因,是因为版本冲突。可以这么说,print((matplotlib.matplotlib_fname())打印出来的配置文件,未必是你正在调用的配置文件。

我自己特意在不同环境调试了一下,用一个实际例子来说,在某个非默认的环境,名称为tch37,打印出来的地址为
D:\Anaconda3\envs\tch37\Lib\site-packages\matplotlib\mpl-data\matplotlibrc
通常在窗口命令下用,conda activate tch37之后再用python,是这个环境。

而实际上,我查了一下自己电脑中的版本,
print(matplotlib.__version__)
'3.2.2'
然后我找到这个3.2.2所对应的位置,在这里,
D:\Anaconda3\pkgs\matplotlib-base-3.2.2-py37h64f37c6_0\Lib\site-packages\matplotlib\mpl-data\matplotlibrc
在vscode中,即使我调用tch37这个环境,用的也是3.2.2这个配置。
所以,如果我要在vscode中使用TkAgg,我应该修改的是这个地方的配置。

总结起来就是,出现这种情况,你先找一下,系统里到底有多少个matplotlibrc这样的文件,然后再慢慢查找到底应该修改哪个配置文件。通常默认的配置文件里有这么一句

## You can also deploy your own backend outside of matplotlib by referring to
## the module name (which must be in the PYTHONPATH) as 'module://my_backend'.
#backend : Agg

你把他改成下面这个样子即可,

## You can also deploy your own backend outside of matplotlib by referring to
## the module name (which must be in the PYTHONPATH) as 'module://my_backend'.
backend : TkAgg

至于anaconda何时,在哪里调用哪个地方的配置,这一点估计谁也扯不清楚。

 

临时暴力改变backend

不得不承认,matplotlib(anaconda?)有时无论你怎么配置,就是存在不可思议的一些怪现象。

如果你临时需要转换backend,其实很简单,直接调用
matplotlib.use('Agg')

matplotlib.use('TkAgg')
暴力完成切换即可。

 

官方的说法摘录

参考:https://matplotlib.org/faq/usage_faq.html

There are four ways to configure your backend. If they conflict each other, the method mentioned last in the following list will be used, e.g. calling use() will override the setting in your matplotlibrc.

  1. The backend parameter in your matplotlibrc file (see Customizing matplotlib):

    backend : WXAgg   # use wxpython with antigrain (agg) rendering
    
  2. Setting the MPLBACKEND environment variable, either for your current shell or for a single script:

    > export MPLBACKEND="module://my_backend"
    > python simple_plot.py> MPLBACKEND="module://my_backend" python simple_plot.py
    

    Setting this environment variable will override the backend parameter in any matplotlibrc, even if there is a matplotlibrc in your current working directory. Therefore setting MPLBACKEND globally, e.g. in your .bashrc or .profile, is discouraged as it might lead to counter-intuitive behavior.

  3. To set the backend for a single script, you can alternatively use the -d command line argument:

    > python script.py -dbackend
    

    This method is deprecated as the -d argument might conflict with scripts which parse command line arguments (see issue #1986). You should use MPLBACKEND instead.

  4. If your script depends on a specific backend you can use the use() function:

    import matplotlib
    matplotlib.use('PS')   # generate postscript output by default
    

    If you use the use() function, this must be done before importing matplotlib.pyplot. Calling use() after pyplot has been imported will have no effect. Using use() will require changes in your code if users want to use a different backend. Therefore, you should avoid explicitly calling use() unless absolutely necessary.

 

这篇关于matplotlib中plot.show()不显示图片的问题:如何把backend=Agg配置为TkAgg的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/813531

相关文章

关于@MapperScan和@ComponentScan的使用问题

《关于@MapperScan和@ComponentScan的使用问题》文章介绍了在使用`@MapperScan`和`@ComponentScan`时可能会遇到的包扫描冲突问题,并提供了解决方法,同时,... 目录@MapperScan和@ComponentScan的使用问题报错如下原因解决办法课外拓展总结@

MybatisGenerator文件生成不出对应文件的问题

《MybatisGenerator文件生成不出对应文件的问题》本文介绍了使用MybatisGenerator生成文件时遇到的问题及解决方法,主要步骤包括检查目标表是否存在、是否能连接到数据库、配置生成... 目录MyBATisGenerator 文件生成不出对应文件先在项目结构里引入“targetProje

C#使用HttpClient进行Post请求出现超时问题的解决及优化

《C#使用HttpClient进行Post请求出现超时问题的解决及优化》最近我的控制台程序发现有时候总是出现请求超时等问题,通常好几分钟最多只有3-4个请求,在使用apipost发现并发10个5分钟也... 目录优化结论单例HttpClient连接池耗尽和并发并发异步最终优化后优化结论我直接上优化结论吧,

windos server2022的配置故障转移服务的图文教程

《windosserver2022的配置故障转移服务的图文教程》本文主要介绍了windosserver2022的配置故障转移服务的图文教程,以确保服务和应用程序的连续性和可用性,文中通过图文介绍的非... 目录准备环境:步骤故障转移群集是 Windows Server 2022 中提供的一种功能,用于在多个

windos server2022里的DFS配置的实现

《windosserver2022里的DFS配置的实现》DFS是WindowsServer操作系统提供的一种功能,用于在多台服务器上集中管理共享文件夹和文件的分布式存储解决方案,本文就来介绍一下wi... 目录什么是DFS?优势:应用场景:DFS配置步骤什么是DFS?DFS指的是分布式文件系统(Distr

Java内存泄漏问题的排查、优化与最佳实践

《Java内存泄漏问题的排查、优化与最佳实践》在Java开发中,内存泄漏是一个常见且令人头疼的问题,内存泄漏指的是程序在运行过程中,已经不再使用的对象没有被及时释放,从而导致内存占用不断增加,最终... 目录引言1. 什么是内存泄漏?常见的内存泄漏情况2. 如何排查 Java 中的内存泄漏?2.1 使用 J

关于Maven中pom.xml文件配置详解

《关于Maven中pom.xml文件配置详解》pom.xml是Maven项目的核心配置文件,它描述了项目的结构、依赖关系、构建配置等信息,通过合理配置pom.xml,可以提高项目的可维护性和构建效率... 目录1. POM文件的基本结构1.1 项目基本信息2. 项目属性2.1 引用属性3. 项目依赖4. 构

numpy求解线性代数相关问题

《numpy求解线性代数相关问题》本文主要介绍了numpy求解线性代数相关问题,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 在numpy中有numpy.array类型和numpy.mat类型,前者是数组类型,后者是矩阵类型。数组

C#中图片如何自适应pictureBox大小

《C#中图片如何自适应pictureBox大小》文章描述了如何在C#中实现图片自适应pictureBox大小,并展示修改前后的效果,修改步骤包括两步,作者分享了个人经验,希望对大家有所帮助... 目录C#图片自适应pictureBox大小编程修改步骤总结C#图片自适应pictureBox大小上图中“z轴

解决systemctl reload nginx重启Nginx服务报错:Job for nginx.service invalid问题

《解决systemctlreloadnginx重启Nginx服务报错:Jobfornginx.serviceinvalid问题》文章描述了通过`systemctlstatusnginx.se... 目录systemctl reload nginx重启Nginx服务报错:Job for nginx.javas