Matplotlib:更新quiver()中的位置和速度

时间:2019-06-01 10:26:09

标签: python matplotlib

我有很多文件,其中包含来自模拟的数据。我想使用每个文件来使用quiver()保存向量字段的图像。不幸的是,我的方法真的很慢。

这是我的代码的一个最小工作示例:

import time
import numpy as np
import matplotlib.pyplot as plt

# Number of files
N = 100000

n_points = 10000

for k in range(N):
    t0 = time.time()

    fig, ax = plt.subplots(1,1, figsize=(5,5))
    ax.axis("off")

    # Get data
    data = np.random.uniform(-1,1,size=(n_points, 4))
    x,y,vx,vy = data[:,0], data[:,1], data[:,2], data[:,3]

    # Normalize and scale velocities
    norm = np.hypot(vx,vy)
    vx = vx / norm 
    vy = vy / norm 
    vx *= 0.05
    vy *= 0.05

    # Plot vectorfield
    ax.quiver(x, y, vx, vy, scale=1., width=0.001, units="xy")

    plt.subplots_adjust(bottom=0, right=1, top=1, left=0)
    plt.savefig("image_" + str(k) + ".png", dpi=300)
    plt.close()

    print("%.2f" % (100.*(k+1.)/N) + " %" + " %.2f" % (time.time()-t0) + " images/s", end="\r")

有什么想法可以加快速度吗?现在,我每秒可以保存大约一张图像。鉴于大量的数据文件,这在我的计算机上需要几个小时才能完成。

谢谢!

编辑

我根据@ImportanceOfBeingErnest的建议修改了上面的代码。但是,代码仍然非常慢。

import time
import numpy as np
import matplotlib.pyplot as plt

# Number of files
N = 20

n_points = 20000

fig, ax = plt.subplots(1,1, figsize=(5,5))
ax.axis("off")
plt.subplots_adjust(bottom=0, right=1, top=1, left=0)

for k in range(N):
    t0 = time.time()

    # Get data
    data = np.random.uniform(-1,1,size=(n_points, 4))
    x,y,vx,vy = data[:,0], data[:,1], data[:,2], data[:,3]

    # Normalize and scale velocities
    norm = np.hypot(vx,vy)
    vx = vx / norm 
    vy = vy / norm 
    vx *= 0.05
    vy *= 0.05

    # Plot vectorfield
    q = ax.quiver(x, y, vx, vy, scale=1., width=0.001, units="xy")
    plt.savefig("image_" + str(k) + ".png", dpi=300)
    #q.remove()
    ax.clear()

    #plt.close()
    t.append(time.time()-t0)
    print("%.2f" % (100.*(k+1.)/N) + " %" + " %.2f" % (time.time()-t0) + " s/images", end="\r")

在进行任何改进之前,一张图像平均需要花费约1.71秒。使用ax.clear()的速度甚至更慢,每个图像只有1.81秒。使用q.remove()的速度稍快一些,每张图像的时间为1.61秒。还有其他建议吗?

1 个答案:

答案 0 :(得分:0)

将dpi更改为“无”将使图像创建速度提高2倍。

plt.savefig("image_" + str(k) + ".png", dpi=None)