Section ini hampir selesai dan semua visual sejauh ini berupa gambar dari .plot. Untuk laporan bisnis, tabel itu sendiri juga bisa menjadi visual: angka dengan pemisah ribuan, kolom bergradasi warna mengikuti besaran nilai, dan bar di dalam sel. pandas menyediakan perangkat itu lewat properti .style, yang mengembalikan objek Styler — pembungkus DataFrame yang menerjemahkan nilai menjadi HTML dan CSS. Styler tidak mengubah data sedikit pun; semua format adalah lapisan tampilan di atas nilai asli. Chapter ini membahas format(), bar(), background_gradient(), set_caption() dengan hide(), serta ekspor tabel bergaya ke Excel dan HTML.

Format Angka dengan format() #

Method format() menerima dictionary yang memetakan nama kolom ke format string Python. Format "Rp{:,.0f}" menambahkan awalan Rp, pemisah ribuan koma, dan membuang desimal, sedangkan "{:,}" hanya menambahkan pemisah ribuan. Untuk memeriksa hasil tanpa browser, objek Styler punya method to_string() yang merender tabel terformat sebagai teks — angka omzet tampil sebagai Rp5,400,000 bukan 5400000. Nilai di dalam DataFrame tidak berubah; penjualan tetap menyimpan integer, dan hanya representasi tampilannya yang dimodifikasi.

python
import os
import tempfile

import pandas as pd

penjualan = pd.DataFrame(
    {
        "produk": ["Kopi Gayo", "Teh Melati", "Gula Aren", "Susu UHT"],
        "unit": [120, 85, 60, 200],
        "omzet": [5_400_000, 3_570_000, 1_920_000, 4_800_000],
    }
)

# format(): tampilan angka diubah, nilai aslinya tetap
styled = penjualan.style.format({"omzet": "Rp{:,.0f}", "unit": "{:,}"})
print(styled.to_string())

# bar(): panjang bar mengikuti besaran nilai kolom
html_bar = (
    penjualan.style.set_uuid("bar-1")
    .bar(subset=["unit"], color="#76b7b2")
    .hide(axis="index")
    .to_html()
)
print("\njumlah bar linear-gradient:", html_bar.count("linear-gradient"))

# background_gradient(): warna mengikuti besaran nilai
html_grad = (
    penjualan.style.set_uuid("grad-1")
    .background_gradient(subset=["omzet"], cmap="Greens")
    .to_html()
)
print("jumlah sel berwarna:", html_grad.count("background-color:"))

# set_caption() dan hide() merapikan kerangka tabel laporan
dengan_judul = (
    penjualan.style.set_uuid("judul-1")
    .set_caption("Ringkasan Penjualan Q1 2026")
    .hide(axis="index")
)
print("caption tampil di HTML:", "<caption>" in dengan_judul.to_html())

# Ekspor laporan bergaya ke Excel lalu baca kembali
with tempfile.TemporaryDirectory() as tmp:
    path = os.path.join(tmp, "laporan_penjualan.xlsx")
    penjualan.style.format({"omzet": "Rp{:,.0f}"}).to_excel(
        path, engine="openpyxl"
    )
    kembali = pd.read_excel(path, index_col=0)
    print(kembali)

Output yang Dihasilkan:

text
 produk unit omzet
0 Kopi Gayo 120 Rp5,400,000
1 Teh Melati 85 Rp3,570,000
2 Gula Aren 60 Rp1,920,000
3 Susu UHT 200 Rp4,800,000


jumlah bar linear-gradient: 4
jumlah sel berwarna: 4
caption tampil di HTML: True
       produk  unit    omzet
0   Kopi Gayo   120  5400000
1  Teh Melati    85  3570000
2   Gula Aren    60  1920000
3    Susu UHT   200  4800000

Mari kita telaah baris-baris kuncinya:

  1. Baris 15-16: penjualan.style.format({...}) membuat objek Styler dengan aturan format per kolom; to_string() merendernya sebagai teks rapi.
  2. Baris 19-25: rantai set_uuid("bar-1").bar(...).hide(axis="index") menghasilkan HTML; to_html() merender tabel ke string HTML, dan count("linear-gradient") menghitung empat bar untuk empat sel kolom unit.
  3. Baris 28-34: background_gradient(subset=["omzet"], cmap="Greens") memberi warna latar tiap sel mengikuti besaran nilainya; hitungan background-color: juga empat.
  4. Baris 37-41: set_caption("Ringkasan Penjualan Q1 2026") menambahkan elemen <caption> di HTML, dibuktikan lewat pemeriksaan keanggotaan string.
  5. Baris 44-51: rantai .format(...).to_excel(...) mengekspor laporan bergaya ke berkas Excel di direktori sementara, lalu read_excel membaca kembali isinya.

Warna dan Bar di Dalam Sel #

bar() menggambar bar horizontal di dalam sel dengan lebar proporsional terhadap nilai terbesar kolom, sehingga perbandingan antarbaris terbaca sekilas tanpa grafik terpisah. background_gradient() menerapkan colormap Matplotlib — parameter cmap="Greens" memakai gradasi hijau — dan hanya menyentuh kolom yang disebut lewat subset. Keduanya bekerja pada lapisan CSS: setiap sel mendapat gaya background sesuai nilai, dan hasil akhirnya adalah tabel HTML yang siap disematkan ke laporan web. Styler menandai tabel dengan id CSS acak; contoh menetapkannya lewat set_uuid() agar keluaran buku ini stabil di setiap eksekusi.

Ekspor Laporan ke Excel dan HTML #

Objek Styler punya dua jalur ekspor utama: to_excel() dan to_html(). Ekspor Excel mempertahankan nilai aslinya — kolom omzet terbaca kembali sebagai integer 5400000, bukan string berformat — sehingga penerima laporan tetap bisa menghitung ulang. Perlu diingat hide(axis="index") hanya menyembunyikan index pada tampilan HTML; saat mengekspor, index tetap tertulis di berkas, dan contoh membaca kembali dengan index_col=0 agar kolom tambahan tidak muncul. Method to_html() menghasilkan string HTML lengkap dengan CSS di dalamnya, siap disematkan ke halaman web atau email laporan.

Styler membuka satu kemampuan yang belum kita sentuh: backend di balik lapisan render bisa diganti. Chapter berikutnya mengganti mesin .plot ke Plotly sehingga grafik yang sama tampil interaktif di browser — penutup section Visualisasi Data.

Dokumentasi resmi yang relevan: pandas.DataFrame.style untuk membuat objek Styler, User Guide: Table Visualization yang merinci seluruh kemampuan styling, dan pandas.io.formats.style.Styler sebagai referensi lengkap method-nya.