2

我对编程比较陌生,我已经尝试过使用 matplotlib 的动画库来制作动画。但是,我制作的动画确实很慢且不连续。下面的代码就是一个例子,但是它确实涉及相对大量的计算。random_set 只是一个随机生成的集合, temp_set 是 random_set 的副本,因为我稍后会对 random_set 进行排序,而 new_set 只存储动画将改变每个点的 y 和 x 的变化值。我尝试在 ax.texts 上使用 transform 可能会使其更快,但我了解到 transform 并不意味着它在传统的数学方式中;所以我只是不断地删除和重新绘制这些点。有什么办法可以加快动画的速度吗?我觉得整段代码对于展示问题的严重程度是必要的。

import matplotlib.pyplot as plt
import matplotlib.animation as animation
import random
import math

fig , ax = plt.subplots()

random_set = []
while len(random_set) != 99:
    choice = random.randint(-100,100)
    if choice in random_set:
        pass
    else:
        random_set.append(choice)
print(random_set)

lengths = [(i,int(len(random_set) / i)) for i in range(1,int(len(random_set) ** (1/2) + 1)) if len(random_set) % i == 0][-1]
print(lengths)
counter = 0

temp_set = []
for i in random_set:
    plt.text(*(counter % lengths[1],math.floor(counter / lengths[1])),i)
    temp_set.append((i,counter % lengths[1],math.floor(counter / lengths[1])))
    counter += 1
random_set.sort()

x_lims = (0,lengths[1])
y_lims = (0,lengths[0])
ax.set_xlim(*x_lims)
ax.set_ylim(*y_lims)
plt.axis("off")

new_set = []
for j in temp_set:
    new_x = random_set.index(j[0]) / lengths[0]
    random_set[random_set.index(j[0])] = None
    new_y = (lengths[0] - 1) / 2
    dy = (new_y - j[2]) / 250
    dx = (new_x - j[1]) / 250
    new_set.append((j[0],dx,dy))

def percentile(i):
    ax.texts.clear()
    for j in range(0,len(new_set)):
        plt.text(temp_set[j][1] + (i * new_set[j][1]),temp_set[j][2] + (i * new_set[j][2]),new_set[j][0])

animate = animation.FuncAnimation(fig, func = percentile, frames = [i for i in range(1,251)], interval = 1,repeat = False)
plt.show()
4

1 回答 1

1

检查此代码:

import matplotlib.pyplot as plt
import matplotlib.animation as animation
import random
import math

fig , ax = plt.subplots()
N = 25

random_set = []
while len(random_set) != 99:
    choice = random.randint(-100,100)
    if choice in random_set:
        pass
    else:
        random_set.append(choice)
print(random_set)

lengths = [(i,int(len(random_set) / i)) for i in range(1,int(len(random_set) ** (1/2) + 1)) if len(random_set) % i == 0][-1]
print(lengths)
counter = 0

temp_set = []
for i in random_set:
    plt.text(*(counter % lengths[1],math.floor(counter / lengths[1])),i)
    temp_set.append((i,counter % lengths[1],math.floor(counter / lengths[1])))
    counter += 1
random_set.sort()

x_lims = (0,lengths[1])
y_lims = (0,lengths[0])
ax.set_xlim(*x_lims)
ax.set_ylim(*y_lims)
plt.axis("off")

new_set = []
for j in temp_set:
    new_x = random_set.index(j[0]) / lengths[0]
    random_set[random_set.index(j[0])] = None
    new_y = (lengths[0] - 1) / 2
    dy = (new_y - j[2]) / N
    dx = (new_x - j[1]) / N
    new_set.append((j[0],dx,dy))

def percentile(i):
    ax.texts.clear()
    for j in range(0,len(new_set)):
        plt.text(temp_set[j][1] + (i * new_set[j][1]),temp_set[j][2] + (i * new_set[j][2]),new_set[j][0])

animate = animation.FuncAnimation(fig, func = percentile, frames = [i for i in range(1,N+1)], interval = 1, repeat = False)
plt.show()

250N(和251)替换了你的N+1,然后我设置N = 25以减少帧数。这是结果:

在此处输入图像描述

于 2020-06-04T16:51:56.693 回答