TransWikia.com

How can I animate Pandas dataframe using matplotlib

Stack Overflow Asked by haqrafiul on November 10, 2021

I have a dataframe that I want to animate (line chart) using matplotlib. My x and y values:


here x = df.index and y = df[‘Likes’]

x y

0 200000

1 50000

2 1000000

.so on.. ….


Code I tried:

from matplotlib import pyplot as plt
from matplotlib import animation
import pandas as pd

df = pd.read_csv("C:\Users\usr\Documents\Sublime\return_to_windows\Files\cod2019.txt", sep='t')

fig = plt.figure()
ax = plt.axes(xlim=(0, 18), ylim=(6514, 209124))
line, = ax.plot([], [], lw=2)


def init():
    line.set_data([], [])
    return line,


def animate(i):
    line.set_data(df.index[i], df['Likes'][i])
    return line,


anim = animation.FuncAnimation(fig, animate, frames=len(df['Likes']), init_func=init, interval=300, blit=True)

plt.show()

I have tried this, but it is showing blank output with no error message. I am using python 3.83, windows machine. Can I do this using numpy? Almost all of the examples used numpy data in FuncAnimation.

One Answer

I have solved it myself, I have used code of "vkakerbeck" from github as a guide to add more data points:

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

df = pd.read_csv("C:\Users\usr\Documents\Sublime\return_to_windows\Files\cod2019.txt", sep='t')
dg = df['Likes']

x_data = []
y_data = []

fig, ax = plt.subplots()
ax.set_xlim(0, len(dg))
ax.set_ylim(0, dg.max() * 1.04) # multiplied with 1.04 to add some gap in y-axis
line, = ax.plot(0, 0)

This part is for formatting

ax.set_xlabel('Part No')
ax.set_ylabel('Number of Likes')
ax.set_title('Likes in Call of Duty 2019')
ax.spines['right'].set_visible(False)
ax.spines['top'].set_visible(False)
fig = plt.gcf()
fig.set_size_inches(12.8, 7.2)  # 720p output

I have used this from that guide to add more data points to make the animation less jumpy:

x = np.array(dg.index)
y = np.array(dg)


def augment(xold, yold, numsteps):
    xnew = []
    ynew = []
    for i in range(len(xold) - 1):
        difX = xold[i + 1] - xold[i]
        stepsX = difX / numsteps
        difY = yold[i + 1] - yold[i]
        stepsY = difY / numsteps
        for s in range(numsteps):
            xnew = np.append(xnew, xold[i] + s * stepsX)
            ynew = np.append(ynew, yold[i] + s * stepsY)
    return xnew, ynew


XN, YN = augment(x, y, 3)
augmented = pd.DataFrame(YN, XN)

ylikes = augmented[0].reset_index()  # Index reset to avoid key error

Main Function:

def animation_frame(i):
    x_data.append(augmented.index[i])
    y_data.append(ylikes[0][i])

    line.set_xdata(x_data)
    line.set_ydata(y_data)
    return line,

    plt.cla()
    plt.tight_layout()


anima = animation.FuncAnimation(fig, func=animation_frame, frames=len(augmented), interval=80)
plt.show()

Export as mp4

Writer = animation.writers['ffmpeg']
writer = Writer(fps=15, bitrate=1000)
anima.save('lines3.mp4', writer=writer)

Answered by haqrafiul on November 10, 2021

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP