Python 用markevery解决动画的困难

Python 用markevery解决动画的困难,python,animation,matplotlib,Python,Animation,Matplotlib,我想按顺序绘制一系列x,y坐标,同时清楚地标记指定的坐标。“markevery”似乎允许用户在matplotlib绘图中执行此操作,但是,当我在动画中提供此属性时,我收到错误“ValueError:markevery是可编辑的,但不是有效的numpy索引形式”。有什么想法吗 我实际的“mark_on”数组要长得多,所以我认为在这里使用linecollection是不合理的 frames = 100 def update_pos(num,data,line): line.set_data(

我想按顺序绘制一系列x,y坐标,同时清楚地标记指定的坐标。“markevery”似乎允许用户在matplotlib绘图中执行此操作,但是,当我在动画中提供此属性时,我收到错误“ValueError:
markevery
是可编辑的,但不是有效的numpy索引形式”。有什么想法吗

我实际的“mark_on”数组要长得多,所以我认为在这里使用linecollection是不合理的

frames = 100
def update_pos(num,data,line):
    line.set_data(data[...,:num])
    return line, 

def traj_ani(data):
    fig_traj = plt.figure()    
    l,= plt.plot([],[],'b', markevery = mark_on, marker = '*')
    plt.xlim(-90,90)
    plt.ylim(-90,90)
    pos_ani = animation.FuncAnimation(fig_traj, update_pos, frames = np.shape(data)[1], fargs = (data,l),
                                  interval = 20, blit = True)
    pos_ani.save('AgentTrajectory.mp4')

data = pd.read_csv('xy_pos.csv', header = None, skiprows = [0])
data = np.asarray(data)
mark_on = [20, 50, 100, 300, 600]
traj_ani(data)
谢谢

下面是一个完整的小型动画示例:

import matplotlib
import matplotlib.pyplot as plt
import matplotlib.animation as animation 
import csv 
import pandas as pd 
import numpy as np 

Writer = animation.writers['ffmpeg']
writer = Writer(fps=2000, metadata=dict(artist='Me'), bitrate=1800)

def update_pos(num,data,line):
    line.set_data(data[...,:num])
    return line, 

def traj_ani(data):
    fig_traj = plt.figure()    
    l,= plt.plot([],[],'b')
    plt.xlim(0,1)
    plt.ylim(0,1)
    pos_ani = animation.FuncAnimation(fig_traj, update_pos, frames = 25, fargs = (data,l),
                                  interval = 200, blit = True)
    pos_ani.save('AgentTrajectory.mp4')


data = np.random.rand(2,25)
traj_ani(data)

在我的完整代码中,我想指定某些帧,这些帧的x-y坐标应该用特殊字符或其他颜色标记

将索引列表设置为markevery似乎有问题,因为它包含绘图数组中不存在的索引。例如,如果打印的数组有3个元素,但为markevery设置的列表包含索引5,则会发生ValueError

解决方案需要在每次迭代中设置markevery列表,并确保它只包含有效的标识

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

mark_on = np.array([2,5,6,13,17,24])

def update_pos(num,data,line):
    line.set_data(data[...,:num])
    mark = mark_on[mark_on < num]
    line.set_markevery(list(mark))
    return line, 

def traj_ani(data):
    fig_traj = plt.figure()    
    l,= plt.plot([],[],'b', markevery = [], marker = '*', mfc="red", mec="red", ms=15)
    plt.xlim(0,1)
    plt.ylim(0,1)
    pos_ani = animation.FuncAnimation(fig_traj, update_pos, frames = 25, fargs = (data,l),
                                  interval = 200, blit = True)
    plt.show()

data = np.random.rand(2,25)
traj_ani(data)
导入matplotlib.pyplot作为plt
将matplotlib.animation导入为动画
将numpy作为np导入
mark_on=np.数组([2,5,6,13,17,24])
def更新位置(数字、数据、行):
line.set_数据(数据[…,:num])
mark=mark\u on[mark\u on
您能否提供有关该问题的详细信息?在没有动画的情况下工作吗?它能在不标记每个Being集合的情况下工作吗?我添加了一个代码的玩具示例,可以生成我想要的动画类型。当我在第一个代码中添加markevery as时,我收到了相同的ValueError。谢谢