Ubuntu plt.subplots() 报错 ValueError: height and width must be > 0|matplotlib前后端
前言
最近在ubuntu系统上跑多分类任务,
性能指标中很重要的是画出混淆矩阵(Confusion Matrix)。
本来以为sklearn.metrics的confusion_matrix、ConfusionMatrixDisplay,与matplotlib.pyplot的梦幻联动应该能很轻松地实现这个效果,
(sklearn官网文档示例:https://scikit-learn.org/1.0/modules/generated/sklearn.metrics.ConfusionMatrixDisplay.html#sklearn.metrics.ConfusionMatrixDisplay)

但是却一直报这个错,
ValueError: height and width must be > 0
仔细一看是函数里面一开始调用plt.subplots() 就报错了。
试了各种方法都调不好,后面觉得可能还是ubuntu系统在显示上面有一些问题,顺着这个方向找,
最终在github上找到解决办法,附上网址:https://github.com/matplotlib/matplotlib/issues/22811。
解决方案
在导入import matplotlib.pyplot as plt后,
设置plt.switch_backend('agg') ,然后再调用plt的函数进行绘制,这样就不会报错。
原理(内容取自matplotlib官方文档):https://matplotlib.org/stable/users/explain/figure/backends.html
matplotlib的显示后端(backends)分为可交互后端(interactive backends)和不可交互后端/静态后端(non-interactive/static backends).
可交互后端通常是有图形界面的系统,比如Windows、MacOS,在matplotlib中对应的backends为:qtagg,
qtagg也是matplotlib默认的backends,

这也是为什么我在linux系统上会报错的原因,Linux系统是没有图形界面的。
而agg是一个没有图形显示界面的终端,适用于Linux系统。
以下是matplotlib官网的不可交互后端代码:

The End
技术之外,欢迎关注我认知成长的公众号 :零度的成长记录
浙公网安备 33010602011771号