Как обновить заголовок и данные анимации гистограммы matplotlib? - PullRequest
0 голосов
/ 09 мая 2019

Я пытался создать горизонтальную гистограмму, где заголовок и данные меняются в каждом кадре. Проблема, с которой я сталкиваюсь, заключается в том, что, если я использую blit=True, данные обновляются, но не заголовок. Когда я использую blit=False, заголовок изменяется, но не данные (он только увеличивается).

Я прочитал десятки ответов и перепробовал все, включая set_title и set_text , но я в полной растерянности. Спасибо за вашу помощь.

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

people = ('','Jim', 'Dan')
plt.rcdefaults()
fig, ax = plt.subplots()
y_pos = np.arange(len(people))

ax.set_xlim(0,10)
ax.set_yticks(y_pos)
ax.set_yticklabels(people)
ax.invert_yaxis() 
ax.set_xlabel('Skill')
titleList=['Basketball','Hockey']
df=[[0,5,7],[0,4,9]]
title = ax.text(0.5,0.95, "Test", bbox={'facecolor':'w', 'alpha':0.5, 'pad':5},transform=ax.transAxes, ha="center")
def animate(i):
       # Example data
    while i<2:
        ax.set_yticks(y_pos)
        ax.set_yticklabels(people)
        ax.set_xlabel(titleList[i])
        performance=df[i]
        title.set_text(str(titleList[i]))
        line= ax.barh(y_pos, performance, align='center',
                color='blue', ecolor='None')
        return line

ani = animation.FuncAnimation(fig,animate, frames=5, blit=True
                            ,interval=2000,repeat=False)

plt.show() 

1 Ответ

1 голос
/ 09 мая 2019
  1. Вы вызываете FuncAnimation() с помощью frames=5, animate(i), таким образом, попытаетесь установить метку и название с помощью titleList[i], который, однако, имеет только 2 записи. Особенно с blit=True, это приведет к ошибкам.

  2. Ваши animate() функции возвращают line; если мы print(line), мы обнаружим, что это скорее <BarContainer object of 3 artists>, чем линия, то есть три прямоугольника barh(). Вам лучше хранить barh() в rects, а затем return [rect for rect in rects], см. этот вопрос

Полный код:

import pandas as pd
import matplotlib as mpl ## uncomment this if you are running this on a Mac
mpl.use('TkAgg')         ## and want to use blit=True
import matplotlib.pyplot as plt 
import matplotlib.animation as animation 
import numpy as np 
import csv

people = ('','Jim', 'Dan')
plt.rcdefaults()
fig, ax = plt.subplots()
y_pos = np.arange(len(people))

ax.set_xlim(0,10)
ax.set_yticks(y_pos)
ax.set_yticklabels(people)
ax.invert_yaxis() 
ax.set_xlabel('Skill')
titleList=['Basketball','Hockey']
df=[[0,5,7],[0,4,9]]
def animate(i):
   # Example data
    while i<2:
        ax.set_yticks(y_pos)
        ax.set_yticklabels(people)
        ax.set_xlabel(titleList[i])
        performance=df[i]

        title = ax.text(0.5,0.95,str(titleList[i]), bbox={'facecolor':'w', 'alpha':0.5, 'pad':5},transform=ax.transAxes, ha="center")

        rects = ax.barh(y_pos, performance, align='center',
                color='blue', ecolor='None')
        return [rect for rect in rects] + [title]


ani = animation.FuncAnimation(fig,animate, frames=2, blit=True
                            ,interval=2000,repeat=False)

plt.show() 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...