解决matplotlib警告问题:“Support for FigureCanvases without a required_interactive_framework“

在使用matplotlib进行PCA降维可视化时遇到MatplotlibDeprecationWarning,警告关于缺少_interactive_framework属性。尽管能成功画图,但通过切换后端如TkAgg可消除警告。文章提供了PCA降维的代码示例以及不同matplotlib后端的简要说明,并推荐使用plt.switch_backend(TkAgg)来解决问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

警告内容

在用matplotlib进行绘图时出现如下警告:

MatplotlibDeprecationWarning: Support for FigureCanvases without a required_interactive_framework attribute was deprecated in Matplotlib 3.6 and will be removed two minor releases later.

原始代码

这里我是想对digits数据集进行PCA降维,并想绘图查看降维效果,结果出现了开头的警告,但是可以画出图来,于是我查了一下,发现是版本问题。

from sklearn import datasets
import matplotlib.pyplot as plt

# 加载数据
data = datasets.load_digits()
import numpy as np
# 数据划分x/y
x=data.data
y=data.target

# 直接调用sklearn的主成分分析函数
from sklearn.decomposition import PCA
pca = PCA(n_components=2)
newdata = pca.fit_transform(x,y)

# 利用主成分分析步骤计算
n = 2 # 确定降维维数
mean = np.mean(x,axis=0)  # 按列取平均
norm_data = x - mean  # 均值归一化
cov = np.cov(norm_data,rowvar=False) # 计算协方差矩阵,每一列代表一个特征
evalue , evector = np.linalg.eig(cov) # 计算特征值和特征向量
index = np.argsort(evalue) #特征值从大到小排序,index为对应下标
n_index = index[-n:]
n_vec = evector[:,n_index] # 取最大的n维特征值对应的特征向量构成映射P矩阵
newdata1 = np.dot(norm_data, n_vec)

x0 = newdata[y == 0]
x1 = newdata[y == 1]
x2 = newdata[y == 2]
x3 = newdata[y == 3]
x4 = newdata[y == 4]
x5 = newdata[y == 5]
x6 = newdata[y == 6]
x7 = newdata[y == 7]
x8 = newdata[y == 8]
x9 = newdata[y == 9]
plt.scatter(x0[:, 0], x0[:, 1], c = "red", marker='o')
plt.scatter(x1[:, 0], x1[:, 1], c = "green", marker='o')
plt.scatter(x2[:, 0], x2[:, 1], c = "blue", marker='o')
plt.scatter(x3[:, 0], x3[:, 1], c = "m", marker='o')
plt.scatter(x4[:, 0], x4[:, 1], c = "yellow", marker='o')
plt.scatter(x5[:, 0], x5[:, 1], c = "cyan", marker='o')
plt.scatter(x6[:, 0], x6[:, 1], c = "black", marker='o')
plt.scatter(x7[:, 0], x7[:, 1], c = "white", marker='o')
plt.scatter(x8[:, 0], x8[:, 1], c = "purple", marker='o')
plt.scatter(x9[:, 0], x9[:, 1], c = "brown", marker='o')

plt.tight_layout()
plt.show()

解决办法

网上一些博主写的降低版本啥的,我个人认为是有些麻烦,因此我在处理时直接切换后端:在代码的第二行后面加上一句plt.switch_backend('TkAgg')即可:

from sklearn import datasets
import matplotlib.pyplot as plt
plt.switch_backend('TkAgg')

除了TkAgg,还有别的后端,当然,不同的后端的使用也会有不同的要求,还需根据自己需求进行调整。

1. Agg:使用反走样技术生成PNG图像。
2. GTK3Agg:使用GTK3库在GTK3应用程序中渲染绘图。
3. QtAgg:使用Qt库在Qt应用程序中渲染绘图。
4. WXAgg:使用wxPython库在wxWidgets应用程序中渲染绘图。
5. MacOSX:在Mac OS X系统中使用内置的渲染器渲染绘图。
6. WebAgg:将绘图保存为HTML页面,可以在Web浏览器中查看。
7. SVG:将绘图保存为SVG矢量图像。

更改之后运行就不会出现警告了。

TkAgg:

 WebAgg:

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值