清理matplotlib队列,保存大pdf图形

0 投票
1 回答
680 浏览
提问于 2025-04-18 14:15

我需要把不同的图表保存在同一个PDF文件里,这些图表的数据来自不同的文件。我用的代码是,每次打开一个特定的文件,用某个函数分析它,然后把结果保存到PDF文件里。

我的问题是,matplotlib的队列越来越多,最后如果我输入plt.show(),就会出现很多不同的图表。我不想这样,我想在不显示图表的情况下清空matplotlib的队列。

我用的代码是:

mu=arange(0.01,20.,0.03)
info1=[]
info2=[]
for i in range(0,7):

    inf1=[]
    inf2=[]
    pathe = path +"%i/"%(i)

    nameplot= "time_traces_%d.pdf"%(i)

    pp=PdfPages(nameplot)

    for j in mu:

        filename="InfoDati_"+"%lf_"%(j)+"%d.txt"%(i)



        fil = pathe + filename

        data=loadtxt(fil)

        t=data[:,0]
        x=data[:,1]
        y=data[:,2]             # y, z should be the simulation, x the sin
        z=data[:,3]

        x=array(x)

        y=array(y)

        z=array(z)

        t=array(t)


        fig=filename

        fig=plt.figure()
        plt.plot(t,x,t,y,t,z)

        plt.xlim(0,500)
        pp.savefig(fig)

        pp.close()
        `

如果我现在输入plt.show(),就会出现成千上万的图表……我需要退出plt.plot的队列,或者类似的操作!

最大的问题是,当图表数量很多时,队列会变得非常大,导致一切崩溃,终端显示'Killed',然后ipython就退出了。

谢谢大家的帮助!

1 个回答

1

我不太确定我是否理解了问题,但你代码中的这一部分表明你可能对自己在做什么不太确定,所以错误可能就在这里:

    fig=filename # useless

    fig=plt.figure() # you're creating a figure that you never destroy
    plt.plot(t,x,t,y,t,z)

    plt.xlim(0,500)
    pp.savefig(fig)

    pp.close() # this shouldn't be inside this loop
  • 你把 filename 赋值给 fig 是没有必要的,因为在下一行你又把 plt.figure() 赋值给了同一个变量。
  • 当你使用 pp.close() 时,这会关闭你当前正在保存图像的PDF文件。但你是在循环里面执行这个操作,而 pp 是在循环外创建的。
  • 这让人得出结论,你的本意是把每个图像添加到PDF文件中,然后在创建下一个图像之前关闭当前打开的图像。所以你可能想在循环里面使用 plt.close(fig)
  • 因为你发布的代码中从来没有关闭你创建的这些图像,这也解释了为什么你会有太多打开的图像。

试着去掉那行多余的代码,把 pp.close() 移到循环 之后 的某个地方,在循环 里面 添加 plt.close(fig),看看这样是否能解决你的问题。

撰写回答