如何用绘图更新散点图?

How to update scatter with plot?

我正在更新图表,但无法加入散点图,有人可以帮我吗?没看懂,怎么实现。

from matplotlib import pyplot as plt
from matplotlib.animation import FuncAnimation


fig = plt.figure()
ax = fig.add_subplot()
line = ax.plot([],[])[0]
x = []
y = []

scat = ax.scatter(x,y,c='Red')

def animate(i):
    x.append(i)
    y.append((-1)**i)
    line.set_data(x, y)
    ax.relim()
    ax.autoscale_view()

    return [line]

anim = FuncAnimation(fig, animate, frames=200, interval=100, blit=True)
plt.show()

我想加点,点的坐标只在X方向变化,Y应该是0。

这里有几个问题需要解决。您必须更新散点图,这是通过 .set_offsets() 更新的 PathCollection。这又要求 x-y 数据位于 (N, 2) 形式的数组中。我们可以将每个动画循环中的两个列表 x、y 组合成这样一个数组,但这将是 time-consuming。相反,我们提前声明 numpy 数组并在循环中更新它。 至于轴标签,您可能已经注意到它们没有在您的动画中更新。这样做的原因是您使用了 blitting,它禁止重绘所有被认为未更改的艺术家。因此,如果您不想手动处理轴限制,则必须关闭 blitting。

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

fig, ax = plt.subplots()
line, = ax.plot([],[])
scat = ax.scatter([], [], c='Red')
n=200
#prepare array for data storage
pos = np.zeros((n, 2))

def animate(i):
    #calculate new x- and y-values
    pos[i, 0] = i
    pos[i, 1] = (-1)**i
    #update line data
    line.set_data(pos[:i, 0], pos[:i, 1])
    #update scatter plot data
    scat.set_offsets(pos[:i, :])
    #update axis view - works only if blit is False
    ax.relim()
    ax.autoscale_view()

    return scat, line

anim = FuncAnimation(fig, animate, frames=n, interval=100, blit=False)
plt.show()

示例输出: