一.问题

当在使用matplotlib.pyplot展示图片时,报错:

AttributeError: 'FigureCanvasInterAgg' object has no attribute 'tostring_rgb'. Did you mean: 'tostring_argb'?

相关代码:

import matplotlib.pyplot as plt  # 可视化

def test_show_pig(x, y):
    plt.plot(x, y)
    plt.title('损失值曲线变化图')
    plt.grid()  # 网格
    plt.savefig('../data/fig/损失值曲线变化图.png')
    plt.show()  # 展示

执行后就报错:

Traceback (most recent call last):
  File "F:\www\py-data\DLProject\线性回归.py", line 144, in <module>
    train(x, y, coef)
  File "F:\www\py-data\DLProject\线性回归.py", line 95, in train
    plt.show()  # 展示
    ^^^^^^^^^^
  File "C:\Users\zhoupenghui\AppData\Roaming\Python\Python312\site-packages\matplotlib\pyplot.py", line 613, in show
    return _get_backend_mod().show(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "D:\Program Files\JetBrains\PyCharm 2023.2.5\plugins\python\helpers\pycharm_matplotlib_backend\backend_interagg.py", line 29, in __call__
    manager.show(**kwargs)
  File "D:\Program Files\JetBrains\PyCharm 2023.2.5\plugins\python\helpers\pycharm_matplotlib_backend\backend_interagg.py", line 112, in show
    self.canvas.show()
  File "D:\Program Files\JetBrains\PyCharm 2023.2.5\plugins\python\helpers\pycharm_matplotlib_backend\backend_interagg.py", line 73, in show
    buffer = self.tostring_rgb()
             ^^^^^^^^^^^^^^^^^
AttributeError: 'FigureCanvasInterAgg' object has no attribute 'tostring_rgb'. Did you mean: 'tostring_argb'?

二.原因

错误是由于 PyCharm 的特殊后端导致的。PyCharm 使用了自己的 matplotlib 后端 backend_interagg,而这个后端缺少 tostring_rgb方法

三.解决方法

方案1:在 PyCharm 中禁用科学模式(推荐)

  1. 打开 PyCharm

  2. 点击菜单栏的 文件(File)设置(Settings)

  3. 在搜索框中输入 科学模式Scientific Mode

  4. 找到 工具(Tools)Python Scientific

  5. 取消勾选 "在工具窗口中显示图(Show plots in tool window)"

  6. 点击 应用(Apply)确定(OK)

  7. 重启 PyCharm 并重新运行代码

方案2:明确设置标准后端

# 在代码开头添加
import matplotlib
# 尝试使用标准后端
matplotlib.use('TkAgg')  # 或 'Qt5Agg', 'MacOSX' 等
import matplotlib.pyplot as plt

方案3:使用 try-except 包装 plt.show(

try:
    plt.show()
except AttributeError as e:
    if 'tostring_rgb' in str(e):
        print("检测到 PyCharm 后端问题,改用保存图片...")
        plt.savefig('pycharm_fallback.png')
        print("图片已保存为 'pycharm_fallback.png'")
    else:
        raise

方案4:完整的修复代码

# 导入相关模块
import torch
from torch.utils.data import TensorDataset
from torch.utils.data import DataLoader
from torch import nn
from torch import optim
from sklearn.datasets import make_regression

# 设置matplotlib后端
import matplotlib
try:
    # 尝试使用标准后端
    matplotlib.use('TkAgg')
    print("使用 TkAgg 后端")
except:
    try:
        matplotlib.use('Qt5Agg')
        print("使用 Qt5Agg 后端")
    except:
        print("使用默认后端")

import matplotlib.pyplot as plt

# 你的其他代码...

方案5:修改函数中的绘图部分

def test_show_pig(x,y)
    # 绘图部分
    plt.figure(figsize=(10, 6))
    plt.plot(x, y, label='预测值', color='blue')
    plt.legend()
    plt.grid()
    
    # 使用 try-except 处理显示问题
    try:
        plt.show()
    except AttributeError as e:
        if 'tostring_rgb' in str(e):
            # PyCharm 特定问题,保存图片
            plt.savefig('prediction_result.png', dpi=300, bbox_inches='tight')
            print("PyCharm 显示问题,图片已保存为 'prediction_result.png'")
        else:
            # 其他错误
            plt.savefig('prediction_result.png', dpi=300, bbox_inches='tight')
            print(f"显示错误: {e}")
            print("图片已保存为 'prediction_result.png'")
    except Exception as e:
        # 其他异常
        print(f"发生错误: {e}")
        plt.savefig('prediction_result.png', dpi=300, bbox_inches='tight')
        print("图片已保存为 'prediction_result.png'")
    
    plt.close()  # 清理图形

方案6:最简单的临时解决方案

将 plt.show()替换为保存图片

# 替换这行
# plt.show()

# 为这行
plt.savefig('prediction_plot.png', dpi=300, bbox_inches='tight')
plt.close()
print("图片已保存为 'prediction_plot.png'")

方案7:检查并更新 PyCharm

  1. 确保你的 PyCharm 是最新版本

  2. 更新 matplotlib: pip install --upgrade matplotlib

  3. 在 PyCharm 中重置设置:

    • 文件(File) → 管理IDE设置(Manage IDE Settings) → 恢复默认设置(Restore Default Settings)

这里我使用的是方案一解决的

Logo

这里是“一人公司”的成长家园。我们提供从产品曝光、技术变现到法律财税的全栈内容,并连接云服务、办公空间等稀缺资源,助你专注创造,无忧运营。

更多推荐