Как добавить легенду / метку в анимации python

Я хочу добавить легенду в анимацию python, такую ​​как line.set_label() ниже. Он похож на plt.plot(x,y,label='%d' %*variable*) .

Тем не менее, я считаю, что коды здесь не работают. В анимации отображаются только изменения строк, но нет доступных ярлыков или легенд. Как я могу исправить эту проблему?

  from matplotlib import pyplot as plt from matplotlib import animation fig = plt.figure() ax = plt.axes(xlim=(0, 2), ylim=(0, 100)) N = 3 lines = [plt.plot([], [])[0] for _ in range(N)] def init(): for line in lines: line.set_data([], []) return lines def animate(i): for j,line in enumerate(lines): line.set_data([0, 2], [10*j,i]) line.set_label('line %d, stage %d'%(j,i)) return lines anim = animation.FuncAnimation(fig, animate, init_func=init, frames=100, interval=20, blit=True) plt.show() 

2 Solutions collect form web for “Как добавить легенду / метку в анимации python”

Я вообще не специалист по matplotlib, но в анимации Double Pendulum они отображают тексты, которые меняются, и это приводит к некоторым вариациям, которые могут вам помочь.

Чтобы получить легенды с фактическим цветом линий, вы можете либо изменить начальные установочные lines :

 lines = [plt.plot([], [], label = 'line {}'.format(i))[0] for i in range(N)] 

или добавьте line.set_label() в цикл for в функции init() . Оба они, похоже, работают так, как ожидалось. По крайней мере, если вы добавите plt.legend(loc="upper left") прямо перед plt.show() .

Однако set_label не работает в функции set_label animate() , но согласно связанной анимации вы можете использовать определенные текстовые поля, добавленные в анимацию, и это, похоже, работает хорошо. Добавьте следующий код после инициализации lines :

 texts = [ax.text(0.80, 0.95-i*0.05, '', transform=ax.transAxes) for i in range(N)] 

И измените animate() следующим образом:

 def animate(i): for j in range(N): lines[j].set_data([0, 2], [10*j,i]) #, label="hei {}".format(i)) texts[j].set_text('line %d, stage %d'%(j,i)) return lines 

Это помещает текст в верхний правый угол и обновляется для каждого шага анимации. Так как строки все еще имеют свою легенду, вы можете упростить в один текст, отображающий только сцену. Но я оставляю тонкую настройку сообщений на ваше усмотрение.

Приложение: Расширение Line2D

Другой альтернативой может быть расширение lines.Line2D и использование этих строк в вашей анимации, что-то похожее на эту статью . Не уверен, что это будет работать с анимацией, но если вы не можете заставить выше работать, это может стоить попробовать.

вы должны вернуть легенду в своей анимационной функции, чтобы она была визуализирована. Попробуйте это, вместо этого:

 legend = plt.legend() def animate(i): for j,line in enumerate(lines): line.set_data([0, 2], [10*j,i]) line.set_label('line %d, stage %d'%(j,i)) legend.remove() legend = plt.legend() return lines + [legend] 

Вы также должны включить тот же код в свою функцию init, init используется при изменении размера окна, иначе легенда исчезнет при изменении размера

Python - лучший язык программирования в мире.