Line plot menunjukkan naik-turunnya tiap produk, tetapi menyembunyikan pertanyaan lain yang penting bagi pemilik toko: berapa total penjualan gabungan tiap bulan, dan bagaimana porsi tiap produk di dalamnya? Area plot menjawabnya dengan mengisi area di bawah garis. Pada pandas, method .plot.area() secara bawaan menumpuk kolom-kolom (stacked=True), sehingga batas atas area terluar adalah jumlah seluruh kolom. Chapter ini memakai dataset penjualan bulanan yang sama dan menunjukkan versi bertumpuk, versi terpisah, serta kaitannya dengan cumsum().

Area Bertumpuk: Komposisi dan Total #

python
import matplotlib

matplotlib.use("Agg")
import pandas as pd
from pathlib import Path

bulan = ["Jan", "Feb", "Mar", "Apr", "Mei", "Jun"]
penjualan = pd.DataFrame(
    {
        "Buku Tulis": [320, 340, 310, 380, 400, 420],
        "Pulpen": [180, 210, 230, 220, 250, 270],
        "Kertas HVS": [260, 250, 290, 300, 280, 310],
    },
    index=pd.Index(bulan, name="bulan"),
)
print(penjualan)
print("\nTotal per bulan:", penjualan.sum(axis=1).to_dict())

ax = penjualan.plot.area(figsize=(8, 4))
print("\nTipe objek  :", type(ax).__name__)
print("Jumlah area :", len(ax.collections))
print("Legend      :", [t.get_text() for t in ax.get_legend().get_texts()])

ax.get_figure().savefig("area_penjualan.png", dpi=100)
print("\nPlot tersimpan sebagai area_penjualan.png")

ax_bebas = penjualan.plot.area(stacked=False, alpha=0.4)
print("\nstacked=False:")
print("Jumlah area :", len(ax_bebas.collections))

kumulatif = penjualan.cumsum()
print("\nBaris terakhir cumsum:", kumulatif.iloc[-1].to_dict())
Path("area_penjualan.png").unlink()

Output yang Dihasilkan:

text
       Buku Tulis  Pulpen  Kertas HVS
bulan                                
Jan           320     180         260
Feb           340     210         250
Mar           310     230         290
Apr           380     220         300
Mei           400     250         280
Jun           420     270         310

Total per bulan: {'Jan': 760, 'Feb': 800, 'Mar': 830, 'Apr': 900, 'Mei': 930, 'Jun': 1000}

Tipe objek  : Axes
Jumlah area : 3
Legend      : ['Buku Tulis', 'Pulpen', 'Kertas HVS']

Plot tersimpan sebagai area_penjualan.png

stacked=False:
Jumlah area : 3

Baris terakhir cumsum: {'Buku Tulis': 2170, 'Pulpen': 1360, 'Kertas HVS': 1690}

Tiga hal yang tercetak saling menjelaskan. Baris Total per bulan memberi angka {'Jan': 760, ..., 'Jun': 1000} — pada plot bertumpuk, angka-angka itu adalah tinggi batas atas area di tiap bulan. len(ax.collections) bernilai 3, sesuai jumlah kolom yang digambar sebagai area (objek PolyCollection pada Matplotlib). Legend berisi tiga nama kolom, dengan Buku Tulis sebagai lapisan terbawah mengikuti urutan kolom DataFrame.

Cara membaca plot bertumpuknya pun berlapis. Ketebalan setiap lapisan pada satu titik bulan adalah kontribusi produk itu bulan tersebut — lapisan Pulpen pada Mei mengisi rentang 400 sampai 650, tebal 250 unit sesuai datanya. Jarak dari dasar gambar ke puncak lapisan terluar adalah total gabungan, sehingga lonjakan total antarbulan terlihat sekaligus dengan pergeseran porsi antarproduk. Bila pertanyaan Anda hanya perbandingan antarproduk tanpa komposisi, bar plot bertumpuk dari chapter ketiga menawarkan pembacaan yang sama dengan sumbu waktu diskret; area plot lebih tepat ketika kesinambungan perubahan dari bulan ke bulan perlu terlihat.

Mari kita telaah baris-baris kuncinya:

  1. Baris 17 (penjualan.sum(axis=1).to_dict()): axis=1 menjumlahkan sepanjang baris (antarproduk) sehingga menghasilkan total per bulan — angka yang sama dengan tinggi puncak area bertumpuk.
  2. Baris 19 (penjualan.plot.area(figsize=(8, 4))): tanpa parameter stacked, pandas memakai stacked=True; area tiap kolom digambar di atas akumulasi kolom sebelumnya.
  3. Baris 27 (penjualan.plot.area(stacked=False, alpha=0.4)): setiap area kembali ke nol — ketiganya bertumpang-tindih dari dasar gambar, dan alpha=0.4 membuat tumpang-tindihnya masih terbaca.
  4. Baris 31-32 (penjualan.cumsum()): cumsum() menghitung akumulasi per kolom; baris terakhirnya {'Buku Tulis': 2170, 'Pulpen': 1360, 'Kertas HVS': 1690} adalah total semester tiap produk.

Hubungan dengan cumsum() layak dipahami dengan saksama. Plot area bertumpuk menumpuk antarkolom pada setiap titik waktu, bukan antarwaktu pada setiap kolom — total Januari 760 adalah jumlah tiga produk pada Januari, bukan akumulasi Januari hingga Juni. Bila yang Anda inginkan adalah “penjualan berjalan sampai hari ini”, hitung dulu cumsum() sepanjang sumbu waktu lalu gambar hasilnya; hasil cetak pada output menunjukkan bentuk akhirnya per kolom.

Area plot menuntut pertanyaan komposisi: berapa bagian tiap kategori dari total. Pertanyaan hubungan antarkolom numerik menuntut alat lain, dan chapter berikutnya merangkum semua pasangan kolom sekaligus lewat matriks korelasi dan scatter matrix.

Referensi resmi: pandas.DataFrame.plot.area untuk parameter stacked, dan pandas.DataFrame.cumsum untuk perhitungan kumulatif yang berkaitan erat dengan area plot.