如何用绘图更新散点图?
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()
示例输出:
我正在更新图表,但无法加入散点图,有人可以帮我吗?没看懂,怎么实现。
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()
示例输出: