Я пишу код для преобразования графиков уравнений kinemati c в pdf и gif, и он работает для первого преобразования, а затем второе преобразование завершается неудачей.
from matplotlib import pyplot as plt
from celluloid import Camera
import threading
import time
timeone = time.time()
def figsaver(fig, args):
fig.savefig(args)
def threadfunc(cam, args):
anim = cam.animate(interval=40)
anim.save(args[0], args[1])
def xypair(angle, color):
pair = XYPair()
pair.setvars((100 * np.cos(np.radians(angle))) * (np.arange(0, ((100 * np.sin(np.radians(angle))) * -2) / -9.8 + (((100 * np.sin(np.radians(angle))) * -2) / -9.8) / 50, (((100 * np.sin(np.radians(angle))) * -2) / -9.8) / 50)), (100 * np.sin(np.radians(angle))) * (np.arange(0, ((100 * np.sin(np.radians(angle))) * -2) / -9.8 + (((100 * np.sin(np.radians(angle))) * -2) / -9.8) / 50, (((100 * np.sin(np.radians(angle))) * -2) / -9.8) / 50)) + (1 / 2) * -9.8 * ((np.arange(0, ((100 * np.sin(np.radians(angle))) * -2) / -9.8 + (((100 * np.sin(np.radians(angle))) * -2) / -9.8) / 50, (((100 * np.sin(np.radians(angle))) * -2) / -9.8) / 50)) ** 2), (np.arange(0, ((100 * np.sin(np.radians(angle))) * -2) / -9.8 + (((100 * np.sin(np.radians(angle))) * -2) / -9.8) / 50, (((100 * np.sin(np.radians(angle))) * -2) / -9.8) / 50)), angle, color)
return pair
class XYPair:
xval = 0
yval = 0
time = 0
angle = 0
label = ''
color = ""
def setvars(self, x, y, time, angle, color):
self.xval = x
self.yval = y
self.time = time
self.angle = angle
self.label = str(angle)+' Degrees'
self.color = color
# Variables
fig1, ax = plt.subplots()
camera = Camera(fig1)
x = np.arange(0, 200, .01)
angles = np.array((20, 30, 45, 60, 70, 90))
colors = ["red", "yellow", "blue", "green", "magenta", "black"]
classlist = []
threadlist = []
print("Calculating each line.")
for x in range(len(angles)):
classlist.append(xypair(angles[x], colors[x]))
for x in classlist:
ax.plot(x.xval[0], x.yval[0], x.color, label=x.label)
ax.set_xlabel("Distance")
ax.set_ylabel("Height")
ax.set_title("Trajectory with speed 100 m/s")
ax.legend()
for z in range(1, 53):
for m in range(len(classlist)):
ax.plot(classlist[m].xval[:z], classlist[m].yval[:z], color=classlist[m].color)
camera.snap()
threadlist.append(threading.Thread(target=figsaver, args=(fig1, "trajectory_graph.pdf",)))
threadlist.append(threading.Thread(target=threadfunc, args=(camera, ('two.gif', 'imagemagick'))))
threadlist[0].start()
threadlist[1].start()
fig2, ax2 = plt.subplots()
camera2 = Camera(fig2)
ax2.set_xlabel("Time")
ax2.set_ylabel("Height")
ax2.set_title("Trajectory with speed 100 m/s")
for x in classlist:
ax2.plot(x.time[0], x.yval[0], x.color, label=x.label)
ax2.legend()
for z in range(1, 53):
for m in classlist:
ax2.plot(m.time[:z], m.yval[:z], color=m.color)
camera2.snap()
threadlist.append(threading.Thread(target=figsaver, args=(fig2, "height_over_time_graph.pdf")))
threadlist.append(threading.Thread(target=threadfunc, args=(camera2, ('one.gif', 'imagemagick'))))
threadlist[2].start()
threadlist[3].start()
print("Saving PDF and .gif files asynchronously in "+str(len(threadlist))+" threads.")
for thread in threadlist:
thread.join()
timetwo = time.time()
print("With multithreading that took "+str(timetwo-timeone)+' seconds in '+str(len(threadlist))+' Threads')
Когда я использую .show () метод, графики правильные. Когда я использую .savefig () в figsaver, он выглядит совершенно иначе в формате PDF. Theres PDF И это метод .show ().
Я также получаю ошибку подпроцесса, говоря, что imagemagi c вернул ненулевое значение из one.gif в anim.save ()