我有一个包含线条的动画,现在我想标记这些点。
我尝试使用plt.annotate()
和plt.text()
,但标签不会移动。
这是我的示例代码:
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as animation
def update_line(num, data, line):
newData = np.array([[1+num,2+num/2,3,4-num/4,5+num],[7,4,9+num/3,2,3]])
line.set_data(newData)
plt.annotate('A0', xy=(newData[0][0],newData[1][0]))
return line,
fig1 = plt.figure()
data = np.array([[1,2,3,4,5],[7,4,9,2,3]])
l, = plt.plot([], [], 'r-')
plt.xlim(0, 20)
plt.ylim(0, 20)
plt.annotate('A0', xy=(data[0][0], data[1][0]))
# plt.text( data[0][0], data[1][0], 'A0')
line_ani = animation.FuncAnimation(fig1, update_line, 25, fargs=(data, l),
interval=200, blit=True)
plt.show()
请问您需要帮忙吗?
我的下一步是: 我有一些以这些点为起点的向量。这些向量在每个动画步骤中会改变它们的长度和方向。 我该如何对它们进行动画处理呢?
没有动画时,这是有效的:
soa =np.array( [ [data[0][0],data[1][0],F_A0[i][0][0],F_A0[i][1][0]],
[data[0][1],data[1][1],F_B0[i][0][0],F_B0[i][1][0]],
[data[0][2],data[1][2],F_D[i][0][0],F_D[i][1][0]] ])
X,Y,U,V = zip(*soa)
ax = plt.gca()
ax.quiver(X,Y,U,V,angles='xy',scale_units='xy',scale=1)
首先非常感谢您快速而且非常有帮助的回答!
我已经通过以下方式解决了我的矢量动画问题:
annotation = ax.annotate("C0", xy=(data[0][2], data[1][2]), xycoords='data',
xytext=(data[0][2]+1, data[1][2]+1), textcoords='data',
arrowprops=dict(arrowstyle="->"))
在“update-function”中,我写:
annotation.xytext = (newData[0][2], newData[1][2])
annotation.xy = (data[0][2]+num, data[1][2]+num)
更改向量(箭头)的起始和结束位置。
但是,如果我有100个或更多的向量呢?写下以下代码是不可行的:
annotation1 = ...
annotation2 = ...
.
:
annotation100 = ...
我尝试使用列表:
...
annotation = [annotation1, annotation2, ... , annotation100]
...
def update(num):
...
return line, annotation
我遇到了这个错误: AttributeError: 'list' object has no attribute 'axes' 我该怎么办?你有什么想法吗?
annotation.xytext
起作用。 - ImportanceOfBeingErnestdir(annotation)
实际上揭示了这一点。我想知道在哪个时候发生了这种变化。显然,在旧版本中它仍然存在。另一个值得注意的事情是,在窗口模式下,blit = True
不会产生预期的结果。至少对我来说,它显示了一个带有原始坐标的静态注释和一个旋转注释。然而,这个 github 问题 建议如果没有遇到性能问题,则不要使用 blitting,所以也许没关系。 - Thomas Kühnblit=True
时,你需要同时返回两个对象,即return line,annotation,
。 - ImportanceOfBeingErnest