plt.imshow()导致seaborn.countplot()输出异常的问题排查
解决Spyder中绘图覆盖/不显示的问题
我刚在Spyder里踩过几乎一模一样的坑!这完全不是你代码逻辑的问题,纯粹是Spyder默认的绘图管理方式和Jupyter不一样导致的。
问题根源
Jupyter里的%matplotlib inline会自动为每段绘图代码创建独立的输出块,但Spyder默认是在同一个Figure画布上更新内容:你先画了柱状图,之后的plt.imshow会直接覆盖或者挤压这个画布的内容,导致原来的柱状图变形,新的数字图像也显示不正常。
三种快速解决办法
1. 显式创建新画布(最推荐)
在每次绘图前用plt.figure()新建一个独立的画布,这样两个图像会分开显示:
# 第一个绘图:数字分布柱状图 plt.figure() # 新建画布 g = sns.countplot(Y_train) plt.title("Digit Distribution") # 可选:加个标题区分 # ... 中间的数据预处理代码 ... # 第二个绘图:显示数字图像 plt.figure() # 再新建一个画布 g = plt.imshow(X_train[0][:,:,0], cmap='gray') # 加上cmap='gray'让数字更清晰 plt.title("Sample Digit Image") plt.show() # 强制弹出所有图像
2. 调整Spyder的绘图后端设置
打开Spyder的偏好设置:Tools > Preferences > IPython console > Graphics,把Backend选项改成Qt5或者Automatic,然后重启Spyder。这样每次绘图会自动弹出新的独立窗口,不会覆盖之前的图像。
3. 每次绘图后显式调用plt.show()
在每段绘图代码后面加上plt.show(),强制显示当前画布,后续代码会自动创建新画布:
g = sns.countplot(Y_train) plt.show() # 先显示柱状图 # ... 中间代码 ... g = plt.imshow(X_train[0][:,:,0], cmap='gray') plt.show() # 再显示数字图像
修改后的完整测试代码片段
import pandas as pd import numpy as np import matplotlib.pyplot as plt import seaborn as sns from sklearn.model_selection import train_test_split from keras.utils.np_utils import to_categorical np.random.seed(2) sns.set(style='white', context='notebook', palette='deep') # Load the data train = pd.read_csv("./input/train.csv") test = pd.read_csv("./input/test.csv") Y_train = train["label"] X_train = train.drop(labels = ["label"],axis = 1) del train # 第一个绘图:数字分布柱状图 plt.figure() g = sns.countplot(Y_train) plt.show() # 数据预处理 X_train = X_train / 255.0 test = test / 255.0 X_train = X_train.values.reshape(-1,28,28,1) test = test.values.reshape(-1,28,28,1) Y_train = to_categorical(Y_train, num_classes = 10) random_seed = 2 X_train, X_val, Y_train, Y_val = train_test_split(X_train, Y_train, test_size = 0.1, random_state=random_seed) # 第二个绘图:显示数字图像 plt.figure() g = plt.imshow(X_train[0][:,:,0], cmap='gray') plt.show()
试试上面的方法,你就能同时看到正常的柱状图和清晰的数字图像啦!
内容的提问来源于stack exchange,提问作者CIsForCookies
相关产品推荐
相关产品推荐

