Python 在matplotlib中设置干图动画
我正在尝试在matplotlib中设置stem绘图的动画,但找不到必要的文档来帮助我。我有一系列的数据文件,每个文件都是这样的:Python 在matplotlib中设置干图动画,python,animation,matplotlib,plot,Python,Animation,Matplotlib,Plot,我正在尝试在matplotlib中设置stem绘图的动画,但找不到必要的文档来帮助我。我有一系列的数据文件,每个文件都是这样的: 1 0.345346 2 0.124325 3 0.534585 我想把每个文件都画成一个单独的框架 根据和教程,我应该创建一个函数来更新每个绘图对象中包含的数据(艺术家?我不确定术语) 从第二个链接,这是更新函数 def update(frame): global P, C, S # Every ring is made more transparent C[:
1 0.345346
2 0.124325
3 0.534585
我想把每个文件都画成一个单独的框架
根据和教程,我应该创建一个函数来更新每个绘图对象中包含的数据(艺术家?我不确定术语)
从第二个链接,这是更新函数
def update(frame):
global P, C, S
# Every ring is made more transparent
C[:,3] = np.maximum(0, C[:,3] - 1.0/n)
# Each ring is made larger
S += (size_max - size_min) / n
# Reset ring specific ring (relative to frame number)
i = frame % 50
P[i] = np.random.uniform(0,1,2)
S[i] = size_min
C[i,3] = 1
# Update scatter object
scat.set_edgecolors(C)
scat.set_sizes(S)
scat.set_offsets(P)
# Return the modified object
return scat,
我怎样才能使这种更新函数适用于干图?forstem
非常简短(事实上,在我学习matplotlib时,这是一个反复出现的问题),但是显示出stem
的输出是一个元组标记线、stemline、基线
,而不是像forplt.plt
或plt.imshow
这样的艺术家对象
因此,当我为动画编写update
函数时,如何更新stem绘图中的数据?给你
import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation
import numpy as np
fig, ax = plt.subplots()
x = np.linspace(0.1, 2*np.pi, 10)
markerline, stemlines, baseline = ax.stem(x, np.cos(x), '-.')
def update(i):
ax.cla()
markerline, stemlines, baseline = ax.stem(x, np.cos(x+i/10), '-.')
ax.set_ylim((-1, 1))
anim = FuncAnimation(fig, update, frames=range(10, 110, 10), interval=500)
anim.save('so.gif', dpi=80, writer='imagemagick')
我认为可以有更好的方法来实现这一点——不需要每次都清除情节。然而,这是可行的
给你
import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation
import numpy as np
fig, ax = plt.subplots()
x = np.linspace(0.1, 2*np.pi, 10)
markerline, stemlines, baseline = ax.stem(x, np.cos(x), '-.')
def update(i):
ax.cla()
markerline, stemlines, baseline = ax.stem(x, np.cos(x+i/10), '-.')
ax.set_ylim((-1, 1))
anim = FuncAnimation(fig, update, frames=range(10, 110, 10), interval=500)
anim.save('so.gif', dpi=80, writer='imagemagick')
我认为可以有更好的方法来实现这一点——不需要每次都清除情节。然而,这是可行的
当使用关键字
use\u line\u collection=True
(Matplotlib 3.3以来的默认行为)时,可以更新这三个元素
- markerline
- 茎线
- 基线
将numpy导入为np
将matplotlib.pyplot作为plt导入
从matplotlib.animation导入FuncAnimation
图,ax=plt.子批次()
x=np.linspace(0.1,2*np.pi,10)
y=np.cos(x)
底部=0
h_-stem=ax.stem(x,y,bottom=bottom,use_-line_-collection=True,linefmt='-.)
def更新(一):
y=np.cos(x+i/10)
#markerline
h_干[0]。设置y数据(y)
h_-stem[0]。设置_扩展数据(x)#常数x不需要
#茎线
h_-stem[1]。设置_路径([np.array([[xx,bottom]),
[xx,yy]]),用于(xx,yy)压缩(x,y)])
#基线
h_-stem[2]。设置_扩展数据([np.min(x),np.max(x)])
h_-stem[2]。设置_-ydata([bottom,bottom])#对于恒定的bottom,这不是必需的
动画=函数动画(图,更新,帧=范围(10,110,10),间隔=1)
anim.save('so.gif',dpi=80,writer='imagemagick')
根据应更新的值(x、y、底部),您可以省略此更新的某些部分或重用当前值。我编写了一个更通用的函数,您可以在其中传递这些值的任意组合:
def update_stem(h_stem, x=None, y=None, bottom=None):
if x is None:
x = h_stem[0].get_xdata()
else:
h_stem[0].set_xdata(x)
h_stem[2].set_xdata([np.min(x), np.max(x)])
if y is None:
y = h_stem[0].get_ydata()
else:
h_stem[0].set_ydata(y)
if bottom is None:
bottom = h_stem[2].get_ydata()[0]
else:
h_stem[2].set_ydata([bottom, bottom])
h_stem[1].set_paths([np.array([[xx, bottom],
[xx, yy]]) for (xx, yy) in zip(x, y)])
使用关键字
use\u line\u collection=True
(Matplotlib 3.3以来的默认行为)时,可以更新这三个元素
- markerline
- 茎线
- 基线
将numpy导入为np
将matplotlib.pyplot作为plt导入
从matplotlib.animation导入FuncAnimation
图,ax=plt.子批次()
x=np.linspace(0.1,2*np.pi,10)
y=np.cos(x)
底部=0
h_-stem=ax.stem(x,y,bottom=bottom,use_-line_-collection=True,linefmt='-.)
def更新(一):
y=np.cos(x+i/10)
#markerline
h_干[0]。设置y数据(y)
h_-stem[0]。设置_扩展数据(x)#常数x不需要
#茎线
h_-stem[1]。设置_路径([np.array([[xx,bottom]),
[xx,yy]]),用于(xx,yy)压缩(x,y)])
#基线
h_-stem[2]。设置_扩展数据([np.min(x),np.max(x)])
h_-stem[2]。设置_-ydata([bottom,bottom])#对于恒定的bottom,这不是必需的
动画=函数动画(图,更新,帧=范围(10,110,10),间隔=1)
anim.save('so.gif',dpi=80,writer='imagemagick')
根据应更新的值(x、y、底部),您可以省略此更新的某些部分或重用当前值。我编写了一个更通用的函数,您可以在其中传递这些值的任意组合:
def update_stem(h_stem, x=None, y=None, bottom=None):
if x is None:
x = h_stem[0].get_xdata()
else:
h_stem[0].set_xdata(x)
h_stem[2].set_xdata([np.min(x), np.max(x)])
if y is None:
y = h_stem[0].get_ydata()
else:
h_stem[0].set_ydata(y)
if bottom is None:
bottom = h_stem[2].get_ydata()[0]
else:
h_stem[2].set_ydata([bottom, bottom])
h_stem[1].set_paths([np.array([[xx, bottom],
[xx, yy]]) for (xx, yy) in zip(x, y)])
好的,建议清除绘图并在每一帧处重新绘制。那会有用的,谢谢!我发现很难学习matplotlib,因为文档很少。我通常可以把这些例子拼凑起来,但我并不真正理解所有的机制。例如,轴和艺术家之间的差异等。您知道解释matplotlib中的逻辑和结构的资源吗?好的,因此建议清除绘图并在每个帧处重新绘制。那会有用的,谢谢!我发现很难学习matplotlib,因为文档很少。我通常可以把这些例子拼凑起来,但我并不真正理解所有的机制。例如,Axis和Artisters之间的差异等。您知道解释matplotlib中的逻辑和结构的资源吗?