Grammar of graphics adalah cara berpikir yang menyusun setiap grafik dari lapisan yang sama, yaitu data yang dipetakan ke estetika, geometri yang menggambar pemetaan itu, serta skala dan panduan yang membacanya. Topik ini memperkenalkan cara berpikir tersebut dengan matplotlib secara manual, sebelum pustaka yang lebih ringkas dipakai pada topik berikutnya. Setelah membacanya, sintaks pustaka apa pun, dari matplotlib sampai ggplot, dapat dibaca sebagai pertanyaan yang sama, yaitu “data mana dipetakan ke mana”.
Data dipetakan ke estetika#
Inti grammar adalah pemetaan. Setiap kolom data ditempatkan pada satu estetika, yaitu posisi sumbu, warna, ukuran, atau bentuk, dan satu grafik adalah daftar pemetaan itu. Grafik PM2.5 terhadap waktu per stasiun, misalnya, adalah kalimat “waktu ke sumbu mendatar, PM2.5 ke sumbu tegak, dan nama stasiun ke warna”, dan dua kalimat itu sudah menentukan sebagian besar bentuk grafiknya.
Cara berpikir ini menjelaskan mengapa grafik yang buruk mudah didiagnosis. Grafik yang memakai warna untuk kategori yang tidak ada dalam data, atau memakai luas untuk nilai yang lebih jujur dibaca sebagai posisi pada sumbu, adalah pemetaan yang salah tipe, dan diagnosisnya berdiri di luar pustaka yang dipakai.
Pemetaan juga menjadi daftar periksa sebelum menulis kode. Pertanyaan “waktu ke mana, PM2.5 ke mana, stasiun ke apa” dijawab lebih dahulu, lalu sintaksnya tinggal menerjemahkan jawaban itu, dan perubahan grafik menjadi perubahan satu baris pemetaan alih-alih penulisan ulang.
Lapisan yang disusun di atas pemetaan#
Di atas pemetaan, grammar menyusun tiga lapisan lagi yang saling terpisah. Geometri memilih bentuk yang menggambar data, misalnya titik, garis, atau batang, dan geometri yang berbeda dapat dibangun di atas pemetaan yang sama. Skala menyatakan bagaimana nilai data diterjemahkan ke posisi dan warna, sedangkan panduan seperti legenda dan sumbu menerjemahkannya kembali bagi pembaca.
Skrip berikut membangun grafik dari data yang sama dengan dua geometri sekaligus, yaitu titik untuk setiap pengukuran dan garis untuk rata-ratanya per jam, sehingga lapisan-lapisan itu terlihat terpisah jelas.
"""Grammar of graphics: pemetaan data ke estetika, lapis demi lapis."""
import matplotlib
matplotlib.use("Agg")
import matplotlib.pyplot as plt
import pandas as pd
data = pd.read_csv(
"ukuran_udara.csv",
na_values=["kosong", "-999.0"],
dtype={"pm25": "string", "kelembapan": "string"},
)
data["pm25"] = data["pm25"].astype("float")
data["waktu"] = pd.to_datetime(data["waktu"], format="mixed", dayfirst=True)
data["stasiun"] = (
data["stasiun"].str.strip().str.replace(r"\s+", " ", regex=True).str.title()
)
sah = data[data["pm25"] < 500]
fig, ax = plt.subplots(figsize=(6.4, 3.6), constrained_layout=True)
# lapis 1: data dipetakan ke estetika (x = waktu, y = pm25, warna = stasiun)
for stasiun, warna in [("Stasiun A", "#4c72b0"), ("Stasiun B", "#c44e52")]:
potong = sah[sah["stasiun"] == stasiun]
# lapis 2: geometri titik
ax.scatter(potong["waktu"], potong["pm25"], s=18, alpha=0.7,
color=warna, label=f"titik {stasiun}")
# lapis 3: geometri garis pada ringkasan per jam (rata-rata)
rata = potong.groupby(potong["waktu"].dt.floor("h"))["pm25"].mean()
ax.plot(rata.index, rata.values, color=warna, linewidth=2,
label=f"garis {stasiun}")
# lapis 4: skala dan panduan
ax.set_xlabel("waktu")
ax.set_ylabel("PM2.5")
ax.set_title("Lapisan titik dan garis dari data yang sama")
ax.legend(fontsize=8)
fig.savefig("lapisan-grammar.png", dpi=110)
print("tersimpan: lapisan-grammar.png")tersimpan: lapisan-grammar.png
Grafik di atas menaruh data mentah dan ringkasannya pada satu bidang dengan pemetaan yang sama, dan keduanya saling menegaskan. Titik yang menyebar lebar di sekitar garis menunjukkan keragaman antar pengukuran, sedangkan garis menyatakan polanya, dan pemilihan menampilkan keduanya adalah keputusan komunikasi yang dinyatakan dengan geometri.
Menyusun pertanyaan sebelum sintaks#
Kerangka grammar mengubah cara memulai sebuah grafik. Alih-alih mencari fungsi yang cocok, pertanyaannya disusun berlapis, yaitu kolom mana yang menjadi posisi, kolom mana yang menjadi warna atau bentuk, geometri apa yang paling jujur untuk pertanyaannya, dan skala apa yang membuat perbedaan terbaca.
Latihan kecilnya sengaja dilakukan dengan matplotlib yang panjang, karena setiap lapisan tertulis eksplisit di sana. Pustaka seperti seaborn atau ggplot meringkas lapisan-lapisan itu menjadi satu pemanggilan, dan pemahaman yang dibangun di sini membuat meringkasnya terasa seperti menyatukan kalimat yang sudah dipahami, bukan menghafal sihir.
Pemetaan warna juga memperkenalkan keputusan aksesibilitas. Warna yang dipilih pada skrip dibedakan bukan hanya rona tetapi cukup kontras untuk dibaca pada cetakan hitam putih, dan pilihan semacam ini adalah bagian dari skala, bukan hiasan.
Kesalahan umum#
Kesalahan pertama adalah memetakan terlalu banyak estetika sekaligus. Grafik dengan warna, ukuran, bentuk, dan ukuran teks yang semuanya membawa makna melebihi daya baca pembacanya, dan aturan praktisnya maksimal tiga pemetaan di luar posisi sumbu.
Kesalahan kedua adalah memilih geometri yang melanggar jenis datanya, misalnya garis untuk kategori nominal yang tidak punya urutan. Garis menyatakan kesinambungan, sehingga pemetaannya hanya sah pada variabel yang urut.
Kesalahan ketiga adalah menyalin sintaks pustaka tanpa mengetahui lapisan mana yang diubah. Perbaikan grafik menjadi tebak-tebakan, sedangkan kalimat “ini perubahan skala” atau “ini geometri baru” menunjuk persis baris yang harus disunting.
Ringkasan#
- Grammar of graphics menyusun grafik dari pemetaan data ke estetika, geometri, skala, dan panduan.
- Grafik buruk didiagnosis sebagai pemetaan yang salah tipe, terlepas dari pustakanya.
- Dua geometri dapat berdiri di atas pemetaan yang sama, misalnya titik mentah bersama garis ringkasannya.
- Pertanyaan pemetaan dijawab sebelum sintaks, dan setiap perubahan grafik menunjuk satu lapisan.
Referensi#
- Matplotlib Usage Guide — Matplotlib documentation — gambaran resmi arsitektur figure dan axes yang dipakai topik ini.
- A Layered Grammar of Graphics — Hadley Wickham, Journal of Computational and Graphical Statistics — makalah rujukan grammar of graphics dalam bentuk yang dipakai pustaka modern.