Python 在matplotlib中设置干图动画

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[:

我正在尝试在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[:,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,
我怎样才能使这种更新函数适用于干图?for
stem
非常简短(事实上,在我学习matplotlib时,这是一个反复出现的问题),但是显示出
stem
的输出是一个元组
标记线、stemline、基线
,而不是像for
plt.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中的逻辑和结构的资源吗?