Animasi Line Plot dengan Matplotlib

Animasi lineplot matplotlib python

Matplotlib adalah sebuah library yang sangat populer dalam bahasa pemrograman Python yang digunakan untuk membuat visualisasi grafik dan plot. Salah satu kelebihan utama dari Matplotlib adalah fleksibilitas dan kekayaan fiturnya. Library ini memberikan kita kontrol penuh atas tampilan dan penyesuaian grafik yang ingin dibuat. Kita dapat mengatur berbagai properti seperti warna, gaya garis, ukuran marker, label sumbu, judul plot, dan masih banyak lagi. Lebih dari itu, kita dapat membuat animasi yang dapat memvisualisasikan pergerakan nilai pada plot yang dibuat. Hal ini memungkinkan kita untuk membuat visualisasi yang sesuai dengan kebutuhan dan preferensi yang diinginkan.

Animasi Line Plot dengan Matplotlib

import pandas as pd
import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation
from datetime import date

# data preparation
stocks = pd.read_csv("stocks_wide.csv")
stocks["Date"] = pd.to_datetime(stocks["Date"])
stocks = stocks.sort_values("Date", ascending=True).reset_index(drop=True)

colors = {"bbri": "#640303", "bbni": "c", "bmri": "orange"}

fig, ax = plt.subplots(figsize=(12, 8))

line_bank = {}
label_bank = {}

for bank in stocks.columns[1:]:
    # create lineplot for each stock code
    line_bank[bank] = plt.plot(
        stocks["Date"],
        stocks[bank],
        color=colors[bank],
        linewidth=2,
    )
    # create text for each stock code ('BBRI', 'BBNI', 'BMRI')
    label_bank[bank] = ax.text(
        stocks["Date"][0],
        stocks[bank][0],
        bank.upper(),
        color=colors[bank],
        fontsize=13,
    )


quarter_text = ("Q1", "Q2", "Q3", "Q4")
mid_q = (
    date(2021, 2, 15),
    date(2021, 5, 15),
    date(2021, 8, 15),
    date(2021, 11, 15),
)


# add text at the middle of each quarter
for idx, q in enumerate(mid_q):
    ax.text(q, 7750, quarter_text[idx], fontsize=13, color="#4F4F4F")


# set plot title
ax.set_title(
    label="Stock Prices of State-Owned Banks (Indonesia 2021)",
    fontsize=15,
    fontweight="bold",
    fontfamily="arial",
    color="#0E2433",
    pad=15,
)

# set Y-Axis label
ax.set_ylabel("Price (Rupiah)", fontsize=13)

# X-Axis limit
start_date = date(2021, 1, 1)
end_date = date(2022, 1, 20)
plt.xlim(start_date, end_date)

# Y-Axis limit
plt.ylim(3000, 8000)


# setup background color for each quarter
start_q1 = date(2021, 1, 1)
start_q2 = date(2021, 4, 1)
start_q3 = date(2021, 7, 1)
start_q4 = date(2021, 10, 1)
start_pad = date(2022, 1, 1)
stop_pad = date(2022, 1, 20)

ax.axvspan(xmin=start_q1, xmax=start_q2, facecolor="#3BAFDA", alpha=0.2)
ax.axvspan(xmin=start_q2, xmax=start_q3, facecolor="#F3B0C3", alpha=0.2)
ax.axvspan(xmin=start_q3, xmax=start_q4, facecolor="orange", alpha=0.2)
ax.axvspan(xmin=start_q4, xmax=start_pad, facecolor="#55CBCD", alpha=0.2)
ax.axvspan(xmin=start_pad, xmax=stop_pad, facecolor="#EEEEEE")


def update(frame):
    """
    Function to update the data and visualization for each animation frame.
    Parameters:
        - frame (int): The current frame number.
    Returns:
        - lines dan text (tuple): The tuple of updated line and text objects.
    """
    cur_date = stocks["Date"][frame]

    for bank in label_bank:
        line_bank[bank][0].set_data(stocks["Date"][:frame], stocks[bank][:frame])
        label_bank[bank].set_position((cur_date, stocks[bank][frame]))

    # the animation function must return a sequence of Artist objects.
    return (
        line_bank["bbri"][0],
        line_bank["bbni"][0],
        line_bank["bmri"][0],
        label_bank["bbri"],
        label_bank["bbni"],
        label_bank["bmri"],
    )


#  setup animation
ani = FuncAnimation(fig, update, frames=len(stocks), interval=80, blit=True)

## directly display the animation in dialog
# plt.show()

# Set the embed limit to a larger value (in MB)
plt.rcParams["animation.embed_limit"] = 100

# save the plot to javascript+html
ani_html = ani.to_jshtml()
with open("animation.html", "w") as f:
    f.write(ani_html)

Kode di atas merupakan contoh penggunaan Python dan library matplotlib untuk membuat animasi lineplot harga saham bank-bank milik negara di Indonesia pada tahun 2021. Berikut ini penjelasan ringkas langkah-langkah yang diperlukan:

  • Pertama, kita mengimpor library yang diperlukan, yaitu pandas untuk manipulasi data dan matplotlib.pyplot untuk visualisasi grafik. Selanjutnya, kita mengimpor juga class FuncAnimation dari modul matplotlib.animation untuk membuat animasi.
  • Kemudian, data saham dari file CSV (stocks_wide.csv) diimpor dan dipersiapkan menggunakan library pandas. Data ini berisi informasi harga saham bank-bank milik negara di Indonesia pada periode tahun 2021.
  • Setelah itu, kita menentukan warna yang akan digunakan untuk setiap bank dengan menyimpannya pada sebuah dictionary yaitu colors. Warna-warna ini akan digunakan untuk membedakan grafik harga saham masing-masing bank.
  • Berikutnya, kita membuat objek gambar (fig) dan objek sumbu (ax) menggunakan plt.subplots(). Objek gambar dan sumbu ini akan digunakan untuk menggambar lineplot harga saham.
  • Selanjutnya, Secara iteratif, kita membuat line plot untuk setiap kode bank dengan menggunakan plt.plot(). Data tanggal akan digunakan sebagai sumbu x, sedangkan data harga saham akan menjadi sumbu y. Selain itu, kita juga menambahkan teks yang menampilkan kode saham setiap bank menggunakan ax.text() dimana posisi teks ini kita sesuaikan dekat dengan posisi setiap lineplot-nya.
  • Setelah itu, kita melakukan beberapa pengaturan tambahan pada tampilan plot, seperti menambahkan teks yang diletakkan pada bagian tengah setiap kuartal, mengatur judul plot dan label sumbu, membatasi rentang sumbu x dan y serta memberikan warna background yang berbeda untuk setiap kuartal.
  • Untuk membuat animasi, kita perlu mendefinisikan sebuah fungsi update(frame) yang akan dipanggil pada setiap frame animasi. Fungsi ini akan memperbarui data dan visualisasi pada setiap frame. Di dalam fungsi ini, data dan posisi garis serta teks akan diperbarui berdasarkan data pada frame tersebut.
  • Selanjutnya, kita menggunakan class FuncAnimation untuk membuat objek animasi. Kita memberikan objek gambar (fig), fungsi update, jumlah frame animasi, dan interval waktu antara frame sebagai argumen. Objek animasi ini akan memanggil fungsi update pada setiap frame dan menghasilkan animasi lineplot harga saham.
  • Terakhir, kita menulis hasil animasi ke dalam file Javascript + HTML menggunakan metode to_jshtml(). File HTML ini akan berisi animasi line plot yang telah dibuat. Anda dapat membuka file ini menggunakan browser web untuk melihat animasi grafik harga saham bank-bank milik negara di Indonesia pada tahun 2021.

Kode ini merupakan contoh penggunaan matplotlib dalam membuat animasi lineplot, dan silahkan mengubahnya sesuai dengan kebutuhan dan data yang ingin di visualisasikan.

silahkan download source kode dan data di sini.

You may also like...

Leave a Reply

Your email address will not be published. Required fields are marked *