Matplotlib Chart not Animating / Pandas Data Issue

Viewed 128

I'm experimenting with Matplotlib animated charts currently. Having an issue where, using a public dataset, the data isn't animating. I am pulling data from a public CSV file following some of the guidance from this post (which has to be updated a bit for things like the URL of the data). I've tested my Matplotlib installation, and it displays static test data without issue in a variety of formats. Not sure if this is a problem in Pandas getting the data across or something I've missed with the animation.

Code:

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

url = 'https://raw.githubusercontent.com/CSSEGISandData/COVID-19/master/csse_covid_19_data/csse_covid_19_time_series/time_series_covid19_deaths_global.csv'
df = pd.read_csv(url, delimiter=',', header='infer')
df_interest = df.loc[
    df['Country/Region'].isin(['United Kingdom', 'US', 'Italy', 'Germany'])
    & df['Province/State'].isna()]
df_interest.rename(
    index=lambda x: df_interest.at[x, 'Country/Region'], inplace=True)
df1 = df_interest.transpose()
df1 = df1.drop(['Province/State', 'Country/Region', 'Lat', 'Long'])
df1 = df1.loc[(df1 != 0).any(1)]
df1.index = pd.to_datetime(df1.index)

print(df1)

color = ['red', 'green', 'blue', 'orange']
fig = plt.figure()
plt.xticks(rotation=45, ha="right", rotation_mode="anchor")  # rotate the x-axis values
plt.subplots_adjust(bottom=0.2, top=0.9)  # ensuring the dates (on the x-axis) fit in the screen
plt.ylabel('No of Deaths')
plt.xlabel('Dates')


def buildmebarchart(i=int):
    plt.legend(df1.columns)
    p = plt.plot(df1[:i].index, df1[:i].values)  # note it only returns the dataset, up to the point i
    for i in range(0, 4):
        p[i].set_color(color[i])  # set the colour of each curve


animator = ani.FuncAnimation(fig, buildmebarchart, interval=50)
plt.show()

Result (a static graph with no data): enter image description here

UPDATE:

It appears to be this line of pandas code that might be the culprit:

p = plt.plot(df1[:i].index, df1[:i].values)

The df1[:i].index and .values are empty when I insert a breakpoint to print them out.

1 Answers

Actually, your code is fine. I can successfully run it as a script without making any changes. Here's my environment:

python                    3.8.5
pandas                    1.1.3
matplotlib                3.3.2

But I suspect, that you are working in Jupyter-Notebook. In this case you have to make some changes. First, set up matplotlib to work interactively in the notebook. You can use ether notebook or nbAgg as a backend (see The builtin backends for more info):

%matplotlib notebook

Next, deactivate the last line of code:

#plt.show() <- comment or delete this line

Should work. Take into account that I use Jupyter-Notebook version 6.1.4. If the problem persists, update the description to reflect your environment.


P.S. Try ipympl as an alternative backend.

Related