Membuat Line Chart Data Time Series Menggunakan Seaborn

visualisasi data time series line chart seaborn python

Line Chart atau Line Plot adalah bentuk visualisasi yang cocok untuk melihat data time series dari waktu ke waktu. Dalam pemrograman python, library Seaborn (plus Matplotlib) merupakan pilihan populer untuk membuat berbagai visualisasi termasuk line chart. Seaborn sendiri dibuat berdasarkan library Matplotlib, sehingga banyak menggunakan fungsi-fungsi Matplotlib, khususnya untuk kustomisasi tampilan plot.

Pada tutorial ini, kita akan membuat visualisasi data time series menggunakan seaborn seperti gambar di bawah. Kita akan menggunakan dua dataset dengan format yang berbeda. Dataset pertama dalam format wide dan yang kedua dalam format long. Alasan penggunaan dua jenis format data adalah agar dapat menunjukkan bagaimana seaborn menangani pembuatan line chart dengan format yang berbeda.

visualisasi data item series line chart seaborn python

Dataset yang digunakan dapat di-download pada link berikut:

Seaborn menyediakan fungsi lineplot() untuk membuat line chart. Pada dasarnya seaborn mampu menangani data dalam format wide maupun long sama baiknya. Perbedaan utamanya adalah bagaimana memosisikan data di dalam parameter fungsinya. Adapun untuk pengaturan parameter lain sama saja. Oleh karena itu, pada bagian pertama dengan data wide, kita hanya membuat beberapa contoh line chart sederhana saja. Adapun kustomisasi lebih banyak akan dilakukan saat menggunakan data long.

Line Plot dengan Data Format Wide

Dataset berisi harga saham harian emiten BBRI (Bank BRI), BMRI (Bank Mandiri) dan BBNI (Bank BNI) tahun 2021.

Preparasi Data
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt

Library pandas diperlukan untuk membaca dataset dalam format csv. Library seborn + matplotlib digunakan untuk membuat visualisasi line plot serta melakukan kustomisasi line plot tersebut.

Membaca Data:

bank_wide = pd.read_csv("bank_wide.csv")

print(bank_wide)
# Output

     Date            bbri_price_rp  bmri_price_rp  bbni_price_rp
0    2021-12-30         4110.0         7025.0         6750.0
1    2021-12-29         4080.0         7100.0         6725.0
2    2021-12-28         4090.0         7050.0         6700.0
3    2021-12-27         4060.0         7000.0         6750.0
4    2021-12-24         4070.0         7050.0         6725.0
..          ...            ...            ...            ...
242  2021-01-08         4283.0         6550.0         6475.0
243  2021-01-07         4176.0         6475.0         6425.0
244  2021-01-06         4098.0         6425.0         6400.0
245  2021-01-05         4166.0         6425.0         6500.0
246  2021-01-04         4205.0         6500.0         6375.0

[247 rows x 4 columns]

Dataset bank_wide terdiri dari 4 kolom, yaitu Date, serta 3 kolom yang berisi harga saham sepanjang tahun 2021 dari 3 emiten bank (bbri_price_rp, bmri_price_rp, bbni_price_rp). Tipe data dari kolom Date ternyata masih bertipe objek, oleh karena itu perlu dirubah menjadi tipe datetime.

bank_wide.info()
# Output

<class 'pandas.core.frame.DataFrame'>
RangeIndex: 247 entries, 0 to 246
Data columns (total 4 columns):
 #   Column         Non-Null Count  Dtype  
---  ------         --------------  -----  
 0   Date           247 non-null    object 
 1   bbri_price_rp  247 non-null    float64
 2   bmri_price_rp  247 non-null    float64
 3   bbni_price_rp  247 non-null    float64
dtypes: float64(3), object(1)
memory usage: 7.8+ KB
# Mengubah kolom Date menjadi tipe datetime
bank_wide["Date"] = pd.to_datetime(bank_wide["Date"])

Lineplot Tunggal

Menampilkan lineplot kolom bbri_price_rp dilakukan dengan mengatur nilai parameter y='bbri_price_rp' dan parameter x='Date'.

plt.figure(figsize=(12, 6))

sns.lineplot(data=bank_wide, x='Date', y='bbri_price_rp')
plt.show()

Untuk mengganti warna dari line dilakukan dengan mengatur parameter color.

plt.figure(figsize=(12, 6))

sns.lineplot(data=bank_wide, x='Date', y='bbri_price_rp', color="orange")
plt.show()

Lineplot Multiple Line

Terdapat bebeapa cara membuat lineplot dengan multiple line menggunakan seaborn. Misal, ingin membandingkan pergerakan harga saham 3 emiten dalam satu plot.

Cara pertama adalah memanggil fungsi lineplot sebanyak 3 kali dan mengatur nilai parameter y yang berbeda. Secara default masing-masing line akan memiliki warna yang berbeda, namun kita juga bisa menentukan warna line secara manual.

plt.figure(figsize=(12, 6))

sns.lineplot(x = 'Date', y = 'bbri_price_rp', data=bank_wide)
sns.lineplot(x = 'Date', y = 'bmri_price_rp', data=bank_wide)
sns.lineplot(x = 'Date', y = 'bbni_price_rp', data=bank_wide)
plt.legend(labels=['BBRI','BMRI', 'BBNI'])
plt.show()

Kedua, menggunakan 1 fungsi lineplot saja namun kita perlu menjadikan kolom Date sebagai indeks dataframe bank_wide. Cara ini tidak memerlukan pengaturan parameter x maupun y. Indeks dataframe akan otomatis menjadi sumbu x.

bank_wide.index = bank_wide["Date"]

emiten = ["bbri_price_rp", "bmri_price_rp", "bbni_price_rp"]

plt.figure(figsize=(12, 6))

sns.lineplot(data=bank_wide[emiten])
plt.show()

Sama seperti sebelumnya, plot yang dihasilkan secara default memiliki warna line yang berbeda. Selain itu style setiap line juga berbeda.

Lineplot Menggunakan Data Format Long

Preparasi Data

Data yang digunakan untuk bagian ini adalah bank_long.csv. Dataset ini berisi informasi yang sama dengan bank_wide.csv, hanya saja ditransformasi dari format wide menjadi long. Dataset terdiri dari 3 kolom yaitu Date, code_stocks dan price_rp. Harga saham semua emiten tersimpan pada kolom price_rp dan nama emiten pada kolom code_stock.

bank_long = pd.read_csv('bank_long.csv')

bank_long["Date"] = pd.to_datetime(bank_long["Date"])

print(bank_long)
# Output

          Date code_stock  price_rp
0   2021-12-30       bbri    4110.0
1   2021-12-29       bbri    4080.0
2   2021-12-28       bbri    4090.0
3   2021-12-27       bbri    4060.0
4   2021-12-24       bbri    4070.0
..         ...        ...       ...
736 2021-01-08       bbni    6475.0
737 2021-01-07       bbni    6425.0
738 2021-01-06       bbni    6400.0
739 2021-01-05       bbni    6500.0
740 2021-01-04       bbni    6375.0

[741 rows x 3 columns]

Lineplot Tunggal

Untuk membuat lineplot satu emiten (misal : bbni) perlu dilakukan filter terlebih dahulu menurut kolom code_stock.

# Filter data untuk emiten BBNI
data_bbni = data_long[data_long["code_stock"] == "bbni"]

plt.figure(figsize=(12, 6))

sns.lineplot(data=data_bbni, x='Date', y='price_rp', 
             color="#DC143C", lw=2)
plt.show()

Plot di atas menampilkan trend harga saham BBNI. Pengaturan juga dilakukan untuk parameter color dan linewidth (atau lw). Parameter lw berfungsi menentukan ketebalan line.

Kita dapat mengatur judul dari plot, sumbu x dan sumbu y mengunakan fungsi set_title, set_xlabel dan set_ylabel.

fig, ax = plt.subplots(figsize = ( 12 , 6 ))
  
sns.lineplot(data=data_bbni, x='Date', y='price_rp', 
             color="#DC143C", lw=2)

# Set x-axis label
ax.set_xlabel( "Periode" , size = 12)
  
# Set y-axis label
ax.set_ylabel( "Harga (Rupiah)" , size = 12)
  
# Set judul
ax.set_title( "Pergerakan Harga Saham Bank BNI (BBNI) Tahun 2021" , 
                size=16, 
                color="#DC143C")

plt.show()

Lineplot Multiple Line

Parameter hue berfungsi memisahkan data menjadi beberapa line berdasarkan kategori tertentu. Pada dataset ini kita set nilai hue="code_stock".

plt.figure(figsize=(12, 6))

sns.lineplot(data=bank_long, x='Date', y='price_rp', hue="code_stock")
plt.show()

Mengatur Palette

Pola warna plot dapat diatur melalui parameter palette. Seaborn secara default telah menyediakan beberapa palette yang dapat digunakan seperti viridis, bright, dark, muted, colorblind, dan sebagainya. Kita juga dapat melakukan customisasi sendiri sesuai yang diinginkan.

Contoh penggunaan palette="dark":

plt.figure(figsize=(12, 6))

sns.lineplot(data=bank_long, 
            x='Date', y='price_rp', hue="code_stock", 
            lw=1.5, palette="dark")
plt.show()

Contoh penggunaan palette custom:

plt.figure(figsize=(12, 6))

cust_palette = ["#640303", "orange", "c"]

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

sns.lineplot(data=bank_long, 
            x='Date', y='price_rp', hue="code_stock", 
            lw=1.5, palette=cust_palette)
plt.show()

Membatasi Nilai Axis (Sumbu X dan Y)

Kita dapat memberikan batas interval untuk sumbu X maupun sumbu Y. Misalkan kita akan menampilkan plot data bulan Desember saja. Hal ini tentu bisa saja kita filter berdasarkan kolom 'Date', namun di sini kita akan memanfaatkan fungsi matplotlib untuk membatasi rentang nilai pada sumbu x dan sumbu y.

from datetime import date

sns.set(style="darkgrid")

plt.figure(figsize=(12, 6))

start_date = pd.Timestamp(date(2021,12,1))
end_date = pd.Timestamp(date(2021,12,31))

# limit axis pada sumbu x
plt.xlim(start_date, end_date)

# limit axis pada sumbu y
plt.ylim(6000, 8000)

cust_palette = ["#640303", "orange", "c"]

sns.lineplot(data=bank_long, 
                x='Date', y='price_rp', hue="code_stock", 
                palette=cust_palette, 
                style='code_stock', lw=3
                markers=["D", "o", "s"], markersize=12)

plt.show()

Plot di atas menampilkan data bulan Desember 2021 saja. Sumbu Y diset dengan rentang nilai 6000-8000 sehingga line emiten BBRI menjadi tidak terlihat.

Selain mengatur limit axis, kita juga mengatur tema seaborn menjadi "darkgrid", kemudian membedakan style dari line menurut kolom 'code_stock' dengan ketebalan 3. Terakhir juga membuat markers yang berbeda untuk setiap line dan dengan ukuran 10.

Menambahkan Teks pada Plot

Kita dapat menambahkan text ke dalam plot dengan fungsi text() dari library matplotlib. Terdapat 3 parameter utama yang perlu ditentukan yaitu x, y dan s. Parameter x dan y menunjukkan posisi text sesuai koordinat sumbu x dan sumbu y. Pada contoh ini, sumbu x merupakan peubah datetime, sehingga parameter x juga bertipe harus datetime. Selain 3 parameter utama tersebut, terdapat parameter lainnya seperti fontsize dan color.

plt.figure(figsize=(12, 6))

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

ax = sns.lineplot(data=data_long, x='Date', y='price_rp', hue="code_stock", 
                  linewidth=1.5, legend=False, palette=cust_palette)

# Menambahkan text pada pertengahan tiap kuartal
mid_q1 = pd.Timestamp(date(2021,2,15))
ax.text(x=mid_q1, y=7750, s="Q1",  fontsize=13, color="#4F4F4F")

mid_q2 = pd.Timestamp(date(2021,5,15))
ax.text(x=mid_q2, y=7750, s="Q2", fontsize=13, color="#4F4F4F")

mid_q3 = pd.Timestamp(date(2021,8,15))
ax.text(x=mid_q3, y=7750, s="Q3", fontsize=13, color="#4F4F4F")

mid_q4 = pd.Timestamp(date(2021,11,15))
ax.text(x=mid_q4, y=7750, s="Q4", fontsize=13, color="#4F4F4F")

# menambahkan text pada ujung setiap line
ax.text(pd.Timestamp(date(2022,1,2)), 4100, "BBRI", color=cust_palette["bbri"])
ax.text(pd.Timestamp(date(2022,1,2)), 6700, "BBNI", color=cust_palette["bbni"])
ax.text(pd.Timestamp(date(2022,1,2)), 7000, "BMRI", color=cust_palette["bmri"])
        
# limit axis sumbu X
start_date = pd.Timestamp(date(2021, 1, 4))
end_date = pd.Timestamp(date(2021, 12, 31))
plt.xlim(start_date, end_date)

# limit axis sumbu Y
plt.ylim(3000, 8000)

plt.show()

Kode di atas akan menambahkan 7 teks pada plot yaitu "Q1", "Q2, "Q3", "Q4", "BBRI", "BBNI" dan "BMRI". Teks "Q1" dan diposisikan pada koodinat x=pd.Timestamp(date(2021,2,15)) atau titik 15 Februari 2021 sumbu X. Pemilihan ini karena titik tersebut merupakan pertengahan periode dari kuartal 1 2021. Alasan yang sama juga diterapkan bagi teks "Q" lainnya. Adapun koordinat sumbu Y diposisikan pada koordinat y=7750 yang berada di bagian atas plot.

Koordinat x untuk text nama-nama emiten diset pada titik x=pd.Timestamp(date(2022,1,2)) atau 2 Januari 2022. Karena data berakhir pada 30 Desember 2021, dengan menambah beberapa periode waktu maka ujung line dan text tidak bertumpuk. Koordinat sumbu Y diatur pada kisaran harga akhir setiap emiten sehingga posisi line dan teks menjadi sejajar.

Kode Lengkap

# import library yang diperlukan
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
from datetime import date

# preparasi data
data_long = pd.read_csv("bank_long.csv")
data_long["Date"] = pd.to_datetime(data_long["Date"])

sns.set(style="white")
plt.figure(figsize=(12, 6))

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

# membuat lineplot
ax = sns.lineplot(
    data=data_long,
    x="Date",
    y="price_rp",
    hue="code_stock",
    linewidth=1.5,
    legend=False,
    palette=cust_palette,
)

# menambahkan text pada ujung setiap line
ax.text(date(2022, 1, 2), 4100, "BBRI", color=cust_palette["bbri"])
ax.text(date(2022, 1, 2), 6700, "BBNI", color=cust_palette["bbni"])
ax.text(date(2022, 1, 2), 7000, "BMRI", color=cust_palette["bmri"])


# Menambahkan text pada pertengahan kuartal
mid_q1 = date(2021, 2, 15)
mid_q2 = date(2021, 5, 15)
mid_q3 = date(2021, 8, 15)
mid_q4 = date(2021, 11, 15)

ax.text(mid_q1, 7750, "Q1", fontsize=13, color="#4F4F4F")
ax.text(mid_q2, 7750, "Q2", fontsize=13, color="#4F4F4F")
ax.text(mid_q3, 7750, "Q3", fontsize=13, color="#4F4F4F")
ax.text(mid_q4, 7750, "Q4", fontsize=13, color="#4F4F4F")


# Menambahkan judul Plot
ax.set_title(
    label="Pergerakan Harga Saham Bank BUMN Tahun 2021",
    fontsize=14,
    color="#0E2433",
    pad=10,
)

# Menghapus label pada sumbu X
ax.set(xlabel=None, xticklabels=[])

# Merubah judul sumbu Y
ax.set(ylabel="Harga (Rupiah)")

# limit axis sumbu X
start_date = pd.Timestamp(date(2021, 1, 1))
end_date = pd.Timestamp(date(2022, 1, 1))
plt.xlim(start_date, end_date)

# limit axis sumbu Y
plt.ylim(3000, 8000)

start_q1 = date(2021, 1, 1)
start_q2 = date(2021, 4, 1)
start_q3 = date(2021, 7, 1)
start_q4 = date(2021, 10, 1)
stop = date(2022, 1, 1)

# Mengatur warna background berdasarkan batas-batas (kuartal 1-4)
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=stop, facecolor="#55CBCD", alpha=0.2)

plt.show()
visualisasi data item series line chart seaborn python

Ringkasan

Seaborn (dan Matplotlib) merupakan library yang powerful untuk membuat visualisasi data. Khususnya data time series dapat dibuat sedemikian rupa menggunakan fungsi lineplot. Seaborn juga bekerja dengan baik untuk data dengan format wide maupun long. Kita dapat membuat plot tunggal, plot dengan beberapa line hingga kustomisasi pada berbagai aspek untuk menghasilkan visualisasi yang kaya.

Tentu saja apa yang disampaikan di sini belum mencakup keseluruhan kemampuan seaborn (dan matplotlib), masih banyak fitur untuk dieksplorasi untuk memperoleh visualisasi yang lebih maksimal lagi.

You may also like...

Leave a Reply

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

Daftar Isi