2201_75335496 2024-06-23 21:37 采纳率: 83.8%
浏览 1
已结题

python plt.subplots创建画布时过大导致报错怎么办?

def closewin():pass
    def draw():
        load_start_time = time.time()
        with open("./StartUp.log","r",encoding = "utf-8") as f:
            text = json.loads(f.read())
        pb["value"] = 10
        win.update()
        namelist = []
        valuelist = []
        for i in range(len(text)):
            valuelist.append([])
            for k,v in text[i].items():
                if not k in namelist:
                    namelist.append(k)
                valuelist[i].append(v)
        #print(namelist)
        #print(valuelist)
        pb["value"] = 20
        win.update()
        # 生成一个包含随机数据的表格
        plt.rcParams['font.family'] = 'SimHei'
        d = pd.DataFrame(valuelist, columns=namelist).round(2)
        pb["value"] = 30
        win.update()
        fig, ax = plt.subplots(figsize=(len(namelist) * 4.2,len(valuelist) + 2))
        pb["value"] = 35
        win.update()
        # 基于pandas表格数据创建和展示图形表格
        column_definitions = []
        for i in namelist:
            column_definitions.append(ColumnDefinition(name = i,border = "l"))
            column_definitions.append(ColumnDefinition(name = i,border = "both"))
        pb["value"] = 40
        win.update()
        tab = Table(d,column_definitions = column_definitions)
        pb["value"] = 50
        win.update()
        # 保存图片
        plt.savefig("table.jpg", dpi=300,bbox_inches='tight')
        pb["value"] = 90
        win.update()
        os.startfile("table.jpg")
        #plt.show()
        plt.close()
        pb["value"] = 100
        pl.config(text = "可以关闭!")
        win.update()
        win.protocol("WM_DELETE_WINDOW",partial(win.destroy))
        load_end_time = time.time()
        print("数据加载时间:",load_end_time - load_start_time)

在数据过多时,python plt.subplots创建画布时过大,导致报错

Exception in Tkinter callback
Traceback (most recent call last):
  File "C:\Users\Administrator\AppData\Local\Programs\Python\Python37\lib\tkinter\__init__.py", line 1705, in __call__
    return self.func(*args)
  File "C:\Users\Administrator\AppData\Local\Programs\Python\Python37\lib\tkinter\__init__.py", line 749, in callit
    func(*args)
  File "C:\Users\Administrator\Desktop\PYExe\2024项目\系统工具\开机启动\StartUp_Log_Viewer.py", line 96, in draw
    fig, ax = plt.subplots(figsize=(len(namelist) * 4.2,len(valuelist) + 2))
  File "C:\Users\Administrator\AppData\Local\Programs\Python\Python37\lib\site-packages\matplotlib\pyplot.py", line 1453, in subplots
    fig = figure(**fig_kw)
  File "C:\Users\Administrator\AppData\Local\Programs\Python\Python37\lib\site-packages\matplotlib\pyplot.py", line 809, in figure
    FigureClass=FigureClass, **kwargs)
  File "C:\Users\Administrator\AppData\Local\Programs\Python\Python37\lib\site-packages\matplotlib\pyplot.py", line 325, in new_figure_manager
    return _get_backend_mod().new_figure_manager(*args, **kwargs)
  File "C:\Users\Administrator\AppData\Local\Programs\Python\Python37\lib\site-packages\matplotlib\backend_bases.py", line 3494, in new_figure_manager
    return cls.new_figure_manager_given_figure(num, fig)
  File "C:\Users\Administrator\AppData\Local\Programs\Python\Python37\lib\site-packages\matplotlib\backends\_backend_tk.py", line 965, in new_figure_manager_given_figure
    canvas = cls.FigureCanvas(figure, master=window)
  File "C:\Users\Administrator\AppData\Local\Programs\Python\Python37\lib\site-packages\matplotlib\_api\deprecation.py", line 389, in wrapper
    return func(*inner_args, **inner_kwargs)
  File "C:\Users\Administrator\AppData\Local\Programs\Python\Python37\lib\site-packages\matplotlib\backends\_backend_tk.py", line 176, in __init__
    master=self._tkcanvas, width=w, height=h)
  File "C:\Users\Administrator\AppData\Local\Programs\Python\Python37\lib\tkinter\__init__.py", line 3545, in __init__
    Image.__init__(self, 'photo', name, cnf, master, **kw)
  File "C:\Users\Administrator\AppData\Local\Programs\Python\Python37\lib\tkinter\__init__.py", line 3501, in __init__
    self.tk.call(('image', 'create', imgtype, name,) + options)
_tkinter.TclError: not enough free memory for image buffer

或者让其不需要展示到plt中就导出?(不要修改画布大小,不然内容装不下的)

  • 写回答

2条回答 默认 最新

  • 阿里嘎多学长 2024-06-23 21:38
    关注

    以下内容由CHATGPT及阿里嘎多学长共同生成、有用望采纳:


    遇到这种内存不足的错误,通常是因为创建的画布尺寸超过了系统能够处理的最大尺寸。但是,你要求不改变画布大小,同时希望不展示到plt窗口中直接导出为图片文件。这里有几个可能的解决方案:

    1. 使用savefig之前不显示画布: 通常,在使用plt.show()之前调用plt.savefig()可以避免内存不足的问题,因为plt.show()会尝试在屏幕上显示画布,而plt.savefig()则直接保存到文件。

    2. 调整图像的分辨率: 你可以通过调整dpi参数来减少图像的分辨率,从而减少内存的使用。例如,将dpi=300调整为dpi=100或更低。

    3. 使用bbox_inches='tight': 你已经在代码中使用了bbox_inches='tight',这有助于确保所有内容都被包含在导出的图像中。

    4. 分批导出: 如果数据量非常大,考虑将数据分成几个部分,分别创建画布并导出,然后再将多个图像合并。

    5. 使用其他图像格式: 某些图像格式可能比其他格式更节省内存。例如,尝试使用PNG而不是JPEG格式。

    6. 增加系统内存: 如果经常需要处理大量数据,可能需要考虑增加系统的物理内存。

    7. 使用虚拟显示: 对于某些特定的应用,可以使用虚拟显示(如matplotlib.use('Agg'))来避免使用Tkinter,这可能会减少内存使用。

    8. 优化数据结构: 确保你的数据结构尽可能紧凑,避免不必要的数据复制或冗余。

    9. 使用更高效的数据存储格式: 如果数据量非常大,考虑使用更高效的数据存储格式,如HDF5,然后再加载到matplotlib中。

    10. 使用服务器或更强大的机器: 如果本地机器的资源有限,可以考虑使用服务器或更强大的机器来处理这些数据。

    请注意,以上建议可能需要根据你的具体情况进行调整。如果你需要进一步的帮助,可以提供更多的信息,例如你的系统配置、数据量大小等。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 7月6日
  • 已采纳回答 6月28日
  • 创建了问题 6月23日

悬赏问题

  • ¥15 乌班图ip地址配置及远程SSH
  • ¥15 怎么让点阵屏显示静态爱心,用keiluVision5写出让点阵屏显示静态爱心的代码,越快越好
  • ¥15 PSPICE制作一个加法器
  • ¥15 javaweb项目无法正常跳转
  • ¥15 VMBox虚拟机无法访问
  • ¥15 skd显示找不到头文件
  • ¥15 机器视觉中图片中长度与真实长度的关系
  • ¥15 fastreport table 怎么只让每页的最下面和最顶部有横线
  • ¥15 java 的protected权限 ,问题在注释里
  • ¥15 这个是哪里有问题啊?