Membuat Line Chart Data Time Series Menggunakan Seaborn
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.
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()
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.
Tulisan Lainnya