首页 > 解决方案 > 在 for 循环中绘制覆盖

问题描述

我正在使用 FeniCS 在不同的时间步长求解 PDE,然后将其存储到各种列表中并使用 matplotlib 在 python 中绘图。我在尝试在循环中创建和保存多个(三个)图时遇到问题。我只能设法保存一个情节而不会覆盖它们。忽略必要的细节,我的代码看起来像这样

for n in range(num_steps):

    #Update current time
    t += dt
    

    #Solve
    solve(a_form == L_form, u)
    
    #Store times
    t_vals.append(t)

    #Solve PDE, gives solution u
    solve(u)

    #Create empty lists
    u_vals_x = []
    u_vals_y = []
    u_vals_z = []

    #Set constant
    xyz_fixed_density = 1000
    #Store u values varying x, y and z held equal to 1
    for n in  np.linspace(x0,x1,xyz_fixed_density):
     u_vals_x.append(u(n,1,1))

     #Store u values varying y, x and z held equal to 1
    for n in  np.linspace(y0,y1,xyz_fixed_density):
     u_vals_y.append(u(1,n,1))


     #Store u values varying z, x and y held equal to 1
    for n in  np.linspace(z0,z1,xyz_fixed_density):
     u_vals_z.append(u(1,1,n))
    
    #First plot
    plt.scatter(np.linspace(x0,x1,xyz_fixed_density),u_vals_x,s=1)
    plt.legend(t_vals)
    plt.xlabel('$x$')
    plt.ylabel('$u(t,x,1,1)$')
    plt.savefig('u_vs_x.png')
    
    #Second plot
    plt.scatter(np.linspace(y0,y1,xyz_fixed_density),u_vals_y,s=1)
    plt.legend(t_vals)
    plt.xlabel('$y$')
    plt.ylabel('$u(t,1,y,1)$')
    plt.savefig('u_vs_y.png')
    
    #Third plot
    plt.scatter(np.linspace(z0,z1,xyz_fixed_density),u_vals_z,s=1)
    plt.legend(t_vals)
    plt.xlabel('$z$')
    plt.ylabel('$u(t,1,1,z)$')
    plt.savefig('u_vs_z.png')

这可能是一个简单的修复,但我似乎无法让它工作。提前致谢。

标签: pythonfor-loopmatplotlib

解决方案


使用当前迭代 ( n) 作为文件名的一部分;例如替换

plt.savefig('u_vs_x.png')

plt.savefig(f'u_vs_x_{n}.png')

这使用 f-string 语法来格式化代码。如果您使用的是不支持 f 字符串的旧 Python 版本,请format显式使用:

plt.savefig('u_vs_x_{}.png'.format(n))

您还需要每次都创建一个新图,例如通过

plt.figure()

推荐阅读