Visualisasi Lolipop Plot dengan Matplotlib

lolipop plot matplotlib python

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()
Lolipop Plot Matplotlib Python

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()
Lolipop plot matplotlib python

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()
Lolipop plot matplotlib python

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()
Lolipop Plot Matplotlib Python
Lolipop Plot Matplotlib Python

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()
Lolipop Plot Matplotlib Python

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()
Lolipop Plot Matplotlib Python

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()
Lolipop Plot Matplotlib Python

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()
lolipop matplotlib python

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()
python matplotlib lolipop

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 warna darkgreen dan jika tidak, maka diberi warna darkred.
  • Membuat baseline pada posisi x=40 menggunakan fungsi vlines.
  • 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()
python matplotlib lolipop

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!

You may also like...

Leave a Reply

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

Daftar Isi