如何更改动画中的线条格式? [复制]

2024-05-01

我使用 matplotlib 制作了这个动画,它工作正常,但是,我需要添加一些动画标签以与其相应的点一起移动。

第一个标签指的是圆与椭圆中心的水平线之间的交点,另一个文本标签位于斜线的中间,注释其长度。

我尝试了一些想法,但没有任何效果。有任何想法吗?截屏 https://i.stack.imgur.com/KLBqB.jpg

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

fig = plt.figure()
ax = fig.add_subplot(111, autoscale_on=True, xlim=(-6, 6), ylim=(-7, 17))

# ax.grid()

line, = ax.plot([], [], 'k', lw=1)
line2, = ax.plot([], [], 'k--', lw=1)


a,b = 3,2
x,y = list(),list()

x1 =np.array([item/10 for item in  range(-30,31)])

y1 = np.sqrt(b**2 * (1-(x1**2 / a**2)))

x =list(x1)+[-item for item in list(x1)]
y =list(y1)+[-item for item in list(y1)]
plt.plot(x, y, 'k:')
plt.plot((0,0), (0,15), 'k--')

ax.annotate('$A$', xy=(0,15), xytext=(-10, 10),color='b',
                textcoords='offset points')
ax.annotate('$O$', xy=(0,-1), xytext=(-10, 10),color='b',ha='center',
                textcoords='offset points')

ax.annotate('$4a$', xy=(0,7), xytext=(-10, 10),color='b',ha='center',
                textcoords='offset points', family='sans serif')



def animate(i):
    thisx = [0, x[i]]
    thisy = [15, y[i]]
    xx = [x[i], 0]
    yy = [y[i], 0]

    line.set_data(thisx, thisy)
    line2.set_data(xx, yy)

    return line, line2

ani = animation.FuncAnimation(fig, animate, np.arange(0, len(x)), interval=20, blit=False)


ax.annotate('$P$', xy=(3,0), xytext=(0, 0),color='b',ha='center',
                textcoords='offset points', family='sans serif', style='italic')



plt.show()
# ani.save('circular_motion.mp4', fps=20)
#
plt.close()

您可以按照与更改线属性相同的方式更改注释属性。只需存储Annotation从返回的对象ax.annotation命令,然后更新其在 animate 函数中的位置。请注意该函数set_position不能正常工作,正如中也指出的那样here https://stackoverflow.com/q/18351932/2454357,因此你必须使用xy属性。

此外,我注意到当你y值接近于零。您可以通过定义角度向量并计算角度来解决这个问题(如果需要解决)xy坐标由此。我自由地改变了你的代码来表达我的意思。

关于斜线的长度,我这里注释为L,因为你没有说明距离的长度OP是,但我想你可以自己填写。

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

fig = plt.figure()
ax = fig.add_subplot(111, autoscale_on=True, xlim=(-6, 6), ylim=(-7, 17))

# ax.grid()

line, = ax.plot([], [], 'k', lw=1)
line2, = ax.plot([], [], 'k--', lw=1)


a,b = 3,2
x,y = list(),list()
z = 15

phi = np.linspace(0,2*np.pi,100)
x =  a * np.cos(phi)
y = -b * np.sin(phi)

plt.plot(x, y, 'k:')
plt.plot((0,0), (0,z), 'k--')

ax.annotate('$A$', xy=(0,15), xytext=(-10, 10),color='b',
                textcoords='offset points')
ax.annotate('$O$', xy=(0,-1), xytext=(-10, 10),color='b',ha='center',
                textcoords='offset points')

ax.annotate('$4a$', xy=(0,7), xytext=(-10, 10),color='b',ha='center',
                textcoords='offset points', family='sans serif')



def animate(i):
    thisx = [0, x[i]]
    thisy = [z, y[i]]
    xx = [x[i], 0]
    yy = [y[i], 0]

    line.set_data(thisx, thisy)
    line2.set_data(xx, yy)

    P.xy = (x[i]*1.05,y[i])
    L.xy = ((x[i]/2)*1.05, z/2+y[i]/2)
    return line, line2, P, L

ani = animation.FuncAnimation(fig, animate, np.arange(0, len(x)), interval=20, blit=False)


P = ax.annotate('$P$', xy=(a,0), xytext=(0, 0),color='b',ha='center',
                textcoords='offset points', family='sans serif', style='italic')
L = ax.annotate('$L$', xy=(a/2,z/2), xytext=(0, 0),color='b',ha='center',
                textcoords='offset points', family='sans serif', style='italic')



plt.show()
# ani.save('circular_motion.mp4', fps=20)
#
plt.close()

希望这可以帮助。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何更改动画中的线条格式? [复制] 的相关文章

随机推荐