Visualisasi Lolipop Plot dengan Matplotlib
Lolipop plot adalah jenis visualisasi data yang digunakan untuk menggambarkan hubungan antara dua variabel atau kategori. Plot ini menggunakan garis horisontal untuk menunjukkan nilai variabel atau kategori pada sumbu Y, sementara panjang garis menunjukkan magnitude atau ukuran nilai tersebut. Umumnya, lolipop plot digunakan untuk membandingkan perbedaan antara beberapa kategori atau grup data.
Kegunaan utama lolipop plot adalah untuk memvisualisasikan perbandingan antara kategori atau grup data dengan cara yang mudah dipahami. Dengan panjang garis yang berbeda, kita dapat membandingkan dan melihat perbedaan magnitude antara kategori secara visual. Lolipop plot juga efektif dalam menyoroti nilai-nilai ekstrem atau perbedaan yang signifikan antara grup data.
Pada tutorial ini kita akan membahas pembuatan lolipop plot menggunakan pustaka matplotlib. Terdapat dua cara yang akan digunakan, yang pertama menggunakan fungsi stem
dan kedua dengan kombinasi scatter
, hline
dan vline
. Pada dasarnya, fungsi stem
dapat menghasilkan plot lolipop yang menarik serta memiliki banyak properti yang dapat dikustomisasi. Namun jika dirasa masih kurang, kita dapat membuat plot lolipop dengan cara kedua, yaitu kombinasi fungsi scatter
, hline
dan vline
.
Di dalam pembahasan pertama, kita akan mempelajari fungsi stem
untuk membuat lolipop plot termasuk juga berbagai kustomisasi yang dapat dilakukan. Selanjutnya pada bagian kedua kita akan membuat lolipop plot melalui kombinasi vline
, hline
dan scatter plot.
Plot Lolipop Dasar
Pertama, kita buat terlebih dahulu data dummy yang akan digunakan dalam tutorial ini. Data akan dibuat dalam bentuk dataframe yang terdiri dari dua kolom yaitu location
dan performance
.
Python
mport matplotlib.pyplot as plt import pandas as pd np.random.seed(99) dummy_data = pd.DataFrame( { "location": [ "Jakarta", "New York", "London", "Tokyo", "Paris", "Los Angeles", "Istanbul", "Rome", "Dubai", "Singapore", "Barcelona", "Sydney", "Amsterdam", "Berlin", "Hong Kong" ], "performance": [ 14.1, 55.9, 64.9, 69.2, 34.2, 72.1, 90.9, 41.9, 77.8, -23.5, -5.1, -17.4, 74.5, -44.1, 88.7,] } ) print(dummy_data)
# OUTPUT location performance 0 Jakarta 14.1 1 New York 55.9 2 London 64.9 3 Tokyo 69.2 4 Paris 34.2 5 Los Angeles 72.1 6 Istanbul 90.9 7 Rome 41.9 8 Dubai 77.8 9 Singapore -23.5 10 Barcelona -5.1 11 Sydney -17.4 12 Amsterdam 74.5 13 Berlin -44.1 14 Hong Kong 88.7
Selanjutnya, untuk membuat lolipop plot, kita perlu mengatur data yang akan mengisi sumbu x dan sumbu y. Umumnya, sumbu x digunakan untuk informasi kategori atau kelompok dan sumby y menunjukkan nilai dari setiap kategori.
Python
# membuat plot lolipop plt.stem(dummy_data["location"], dummy_data["performance"]) plt.show()
Secara default, matplotlib akan merender plot sesuai urutan data yang diberikan. Jadi, jika ingin membuat plot yang terurut maka kita perlu mengurutkan datanya terlebih dahulu baik secara ascending
maupun descending
(asending=False
).
Python
dummy_data = dummy_data.sort_values(by="performance", ascending=True) # membuat plot lolipop plt.stem(dummy_data["location"], dummy_data["performance"]) plt.show()
Seperti yang terlihat pada 2 plot awal, banyaknya data serta nama kategori yang relatif panjang, membuat tampilan pada sumbu x menjadi berantakan. Salah satu solusi yang cocok, terutama untuk data yang cukup banyak adalah menukar posisi data antara sumbu x dan sumbu y. Proses ini dapat dilakukan dengan mengatur parameter orientation="horizontal"
.
Python
# membuat plot lolipop plt.stem(dummy_data["location"], dummy_data["performance"], orientation="horizontal") plt.show()
Pengaturan Marker
Marker atau penanda pada ujung-ujung lolipop dapat diatur melalui parameter markerfmt
. Parameter ini menerima argumen dalam format string yang menunjukkan warna serta bentuk dari marker yang diinginkan. Beberapa contoh argumen yang valid untuk parameter ini marketfmt
adalah sebagai berikut:
'green'
: bentuk lingkaran warna hijau'#000000'
: bentuk lingkaran warna hitam'ro'
: bentuk lingkaran berwarna merah (red)'bs'
: bentuk kotak berwarna biru (blue)'m*'
: bentuk bintang warna magenta-
'g^'
: bentuk segitiga warna hijau (green) 'cD'
: bentuk diamond warna cyan- dsb
Python
plt.stem( dummy_data["location"], dummy_data["performance"], orientation="horizontal", markerfmt="cD" ) plt.show()
Pengaturan Garis
Pengaturan warna garis dapat dilakukan melalui parameter linefmt
. Parameter ini dapat menerima argumen berupa string seperti 'red'
, 'darkgreen'
, 'cyan'
ataupun dalam format hex seperti '#FFDDAA'
, '#88888'
dan sebagainya untuk mengatur pewarnaan di setiap garisnya. Selain itu parameter dapat pula menerima argumen dalam format tertentu seperti berikut:
'drakred'
: garis lurus warna merah gelap- ‘
r:'
: garis titik-titik (dotted) warna merah 'g--'
: garis putus-putus (dashed) warna hijau'b-.'
: garis putus-putus dan titik warna biru- dsb
Format yang sama juga dapat digunakan untuk mengatur pewarnaan pada baseline atau garis batas melalui parameter basefmt
.
Python
# membuat plot lolipop plt.stem( dummy_data["location"], dummy_data["performance"], orientation="horizontal", markerfmt="cD", linefmt="#006400", basefmt="purple" ) plt.show()
Contoh lainnya, mengatur garis dengan format garis putus-putus berwarna hijau dan baseline dengan format tiik-titik warna merah:
Python
# membuat plot lolipop plt.stem( dummy_data["location"], dummy_data["performance"], orientation="horizontal", markerfmt="cD", linefmt="g--", basefmt="r:", ) plt.show()
Marker dan Garis (Lanjutan)
Selain menggunakan parameter markerfmt
, linefmt
dan basefmt
, kita dapat membuat kustomisasi lebih lanjut bagi ketiga properti tersebut. Langkah yang perlu dilakukan yaitu, unpack fungsi stem
dan simpan ke dalam variabel markers
, stemlines
dan baseline
. Selanjutnya properti untuk setiap variabel dapat diatur menggunakan fungsi setp
.
Python
# membuat plot lolipop (markers, stemlines, baseline) = plt.stem( dummy_data["location"], dummy_data["performance"], orientation="horizontal", ) # pengaturan marker plt.setp( markers, marker="o", color="yellow", markersize=10, markeredgecolor="#8B0000", markeredgewidth=0.8, ) # pengaturan line plt.setp(stemlines, linestyle="-.", color="#222222", linewidth=1.5) # pengaturan baseline plt.setp(baseline, linestyle="-", color="darkorange", linewidth=8) plt.show()
Menggeser Baseline
Misalkan terdapat kondisi bahwa performa positif saja tidaklah cukup dan harus memiliki performa lebih dari 40, maka plot sebelumnya masih belum mampu menggambarkan batasan tersebut. Agar plot semakin menggambarkan situasi yang diinginkan kita dapat menggeser baseline ke posisi lain, misalkan ke angka 40. Caranya adalah dengan mengatur parameter bottom=40
pada fungsi stem
.
Python
# membuat plot lolipop (markers, stemlines, baseline) = plt.stem( dummy_data["location"], dummy_data["performance"], orientation="horizontal", bottom=40 # mengatur posisi baseline ) # pengaturan marker plt.setp( markers, marker="o", color="lightgreen", markersize=10, markeredgecolor="#006400", markeredgewidth=0.8, ) # pengaturan line plt.setp(stemlines, linestyle="-.", color="#222222", linewidth=1.5) # pengaturan baseline plt.setp(baseline, linestyle="-", color="darkorange", linewidth=8) plt.show()
Judul Plot dan Axis
Sekarang kita lengkapi lolipop plot dengan menambahkan judul serta label pada kedua sumbunya. Pengaturan ini bukanlah fitur spesifik pada lolipop plot saja sehingga dapat diterapkan pada setiap jenis plot lainnya yang dibuat dengan matplotlib (juga seaborn).
Ada beberapa cara untuk mengatur judul plot dan judul sumbu x maupun y. Pada kode berikut, kita akan menggunakan fungsi title
, xlabel
dan ylabel
.
Python
fig = plt.figure(figsize=(5, 6)) # membuat plot lolipop (markers, stemlines, baseline) = plt.stem( dummy_data["location"], dummy_data["performance"], orientation="horizontal", bottom=40 ) # pengaturan marker plt.setp( markers, marker="o", color="lightgreen", markersize=10, markeredgecolor="#006400", markeredgewidth=0.8, ) # pengaturan line plt.setp(stemlines, linestyle="-.", color="#222222", linewidth=1.5) # pengaturan baseline plt.setp(baseline, linestyle="-", color="darkorange", linewidth=4) title_font = { "fontsize": 12, "fontweight": "bold", "fontstyle": "normal", "fontfamily": "verdana", "color": "#2F2F2F", "verticalalignment": "center", } # mengatur judul dan label axis plt.title("Evaluasi Performa Menurut Kota", fontdict=title_font, pad=15) plt.xlabel("Skor Performa") # dapat diatur juga parameter fontdict plt.ylabel("Lokasi") # dapat diatur juga parameter fontdict plt.show()
Scatter + (Hline dan Vline)
Hasil plot lolipop yang diperoleh melalui fungsi stem
sebelumnya sudah cukup atraktif dan mudah dibaca. Namun kita masih bisa bermain-main lebih banyak lagi menggunakan kombinasi scatter
, hline
dan vline
pada matplotlib.
Pada contoh di bawah ini, kita melakukan beberapa kustomisasi plot untuk menghasilkan lolipop plot yang menarik. Berikut penjelasan singkat proses pembuatan lolipop yang dilakukan:
- Membuat koleksi color menggunakan list komprehensif. Jika nilai
perf
lebih besar dari 40 maka diberi warnadarkgreen
dan jika tidak, maka diberi warnadarkred
. - Membuat baseline pada posisi
x=40
menggunakan fungsivlines
. - Melakukan iterasi untuk membuat garis horizontal sebagai bagian dari lolipop. Setiap garis dibuat sedemikian rupa menggunakan fungsi
hlines
. - Membuat plot scatter dengan beberapa pengaturan parameter di dalamnya. Salah satunya, mengatur parameter
s
agar abar besaran marker yang dibuat menyesuaikan dengan besarnya nilai pada data. - Melakukan iterasi untuk mengatur warna teks pada setiap label sumbu y sesuai dengan warna pada lolipop-nya
- Mengatur batas-batas sumbu x dan y agar menampilkan keseluruhan data dengan baik.
- Mengatur porperti untuk judul plot serta judul sumbu x dan sumbu y.
Python
fig, ax = plt.subplots(figsize=(6, 7)) bottom = 40 loc = dummy_data["location"] perf = dummy_data["performance"] # membuat koleksi color sesuai batas nilai my_color = ["darkgreen" if p > bottom else "darkred" for p in perf] # membuat baseline menggunakan vlines plt.vlines( x=bottom, ymin=min(perf) + 0.5, ymax=max(perf) - 0.5, color="orange", linewidth=4, alpha=1, ) # membuat horizontal line for i, p in enumerate(perf): xmin = bottom if p > bottom else p xmax = p if p > bottom else bottom plt.hlines( y=i, xmin=xmin, xmax=xmax, color="gray", linewidth=0.8, alpha=0.5, linestyles="--", ) # membuat plot scatter plt.scatter( perf, loc, color=my_color, marker="o", s=abs(perf - 40) * 2.5, alpha=0.8, ) # mengatur warna teks pada sumbu Y ytick_labels = ax.get_yticklabels() for idx, lbl in enumerate(ytick_labels): val = float(x[idx]) lbl.set_color(my_color[idx]) # mengatur limit axis sumbu X dan Y xmin, xmax = -60, 110 plt.xlim(xmin, xmax) # karena data Y kategorik maka nilai dari 0 - len(data) ymin, ymax = -0.75, len(loc) - 0.5 plt.ylim(ymin, ymax) # Mencari indeks pertama dari nilai yang lebih besar dari 40 index_pos = 5 # hard coding (seharusnya dapat pencarian dalam list) # Mengatur warna background berdasarkan batas-batas tertentu ax.axhspan(ymin=ymin, ymax=index_pos + 0.5, facecolor="darkred", alpha=0.15) ax.axhspan(ymin=index_pos + 0.5, ymax=ymax, facecolor="darkgreen", alpha=0.15) # mengatur text judul dan label pada sumbu x dan y title_font = {"fontsize": 12, "fontweight": "bold", "color": "#FF7700"} ax.set_title("Evaluasi Performa Menurut Kota", fontdict=title_font, pad=15) ax.set(xlabel="Skor Performa", ylabel="Lokasi") # menampilkan plot plt.show()
Pada pembuatan lolipop plot di atas, kita mengatur banyak hal sedemikian rupa tentunya untuk alasan mendemonstrasikan fitur-fitur pada matplotlib. Namun, pada praktiknya bisa jadi tidak semua hal tersebut diperlukan. Bagian terpenting dalam pembuatan visualisasi yaitu tidak hanya sekedar estetika visual namun agar user dapat menangkap informasi dengan baik dan tidak terjadi kesalahan dalam memaknai plot.
Ringkasan
Pada tutorial ini sudah dibahas bagaimana membuat lolipop pllot menggunakan fungsi stem
pada matplotlib. Kita juga sudah mempelajari bagaimana mengatur properti pada marker, garis dan garis batas yang meliputi pewarnaan, bentuk serta ukurannya. Pada bagian akhir kita juga membahas pembuatan lolipop plot yang lebih kustom melalui kombinasi dari fungsi scatter
dengan vline
dan hline
serta mengatur berbagai aspek visual lainnya pada plot yang dibuat.
Selamat mencoba!
Tulisan Lainnya