Matplotlib cukup untuk grafik statis di laporan bulanan. Tapi begitu klien minta bisa zoom ke data tertentu, atau tim sales ingin menunjuk titik di grafik untuk melihat angka persisnya, gambar PNG tidak lagi menjawab. Plotly menutup celah itu. Grafiknya interaktif sejak awal: bisa di-zoom, di-hover, diklik legend-nya untuk menyembunyikan satu seri, sampai diekspor menjadi file HTML mandiri yang dibuka siapa saja tanpa perlu install Python.

Kalau kamu sudah biasa mengolah data dengan Pandas, Plotly terasa alami karena plotly.express menerima DataFrame langsung, tanpa konversi bolak-balik. Dibanding Matplotlib yang butuh banyak baris kode untuk styling rapi, satu panggilan px.line sudah memberi tooltip dan zoom bawaan. Contoh di artikel ini jalan di Python 3.10 ke atas.

Pasang Plotly dan Siapkan Data

Buat virtual environment, lalu install dua paket: Plotly untuk grafiknya dan Pandas untuk menyiapkan data.

bash
pip install plotly pandas

Untuk contoh, saya pakai data penjualan fiktif selama enam bulan. Tulis ini di file grafik.py atau langsung di notebook.

python
import pandas as pd
import plotly.express as px

df = pd.DataFrame({
    "bulan": ["Jan", "Feb", "Mar", "Apr", "Mei", "Jun"],
    "penjualan": [120, 145, 138, 190, 210, 205],
    "biaya": [80, 82, 90, 95, 110, 118],
    "region": ["Jawa", "Jawa", "Sumatra", "Sumatra", "Jawa", "Sumatra"],
})

fig = px.line(df, x="bulan", y="penjualan", title="Penjualan Enam Bulan Pertama")
fig.show()

Jalankan. Jendela browser terbuka menampilkan garis penjualan. Arahkan kursor ke titik mana pun untuk melihat tooltip berisi bulan dan nilainya. Seret (drag) di area grafik untuk zoom, lalu klik dua kali untuk kembali ke tampilan penuh. Kalau kamu pakai Jupyter Notebook atau Google Colab, grafik tampil inline tepat di bawah sel.

Plotly Express vs Graph Objects

Plotly punya dua API. plotly.express (alias px) untuk grafik cepat lewat satu panggilan fungsi. plotly.graph_objects (alias go) untuk kontrol penuh: kamu menyusun trace satu per satu, mirip Matplotlib tapi hasilnya tetap interaktif. Untuk sebagian besar kasus, px sudah cukup. Pakai go saat perlu menumpuk banyak elemen dalam satu figure atau mengatur detail yang tidak diekspos px.

python
import plotly.graph_objects as go

fig = go.Figure()
fig.add_trace(go.Scatter(
    x=df["bulan"], y=df["penjualan"],
    mode="lines+markers", name="Penjualan",
))
fig.add_trace(go.Scatter(
    x=df["bulan"], y=df["biaya"],
    mode="lines+markers", name="Biaya",
))
fig.update_layout(title="Penjualan vs Biaya")
fig.show()

Klik nama seri di legend untuk menyembunyikan atau memunculkannya kembali. Inilah bedanya dengan grafik statis: pembaca yang mengeksplorasi data, bukan sekadar melihatnya.

Bar Chart dan Pewarnaan Kategori

Line chart bukan satu-satunya pilihan. px.bar membuat bar chart, dan parameter color memecah bar berdasarkan kolom kategori. Ini berguna untuk membandingkan antar region, produk, atau cabang.

python
fig = px.bar(
    df,
    x="bulan",
    y="penjualan",
    color="region",
    title="Penjualan per Bulan per Region",
)
fig.show()

Scatter Plot dengan Ukuran dan Warna

Scatter plot bisa menampung lebih dari dua variabel. Sumbu x dan y untuk dua angka, color untuk kategori, size untuk nilai ketiga, dan hover_name untuk label tooltip.

python
fig = px.scatter(
    df,
    x="biaya",
    y="penjualan",
    size="penjualan",
    color="region",
    hover_name="bulan",
    title="Hubungan Biaya dan Penjualan",
)
fig.show()

Kustomisasi Layout dan Tema

Tampilan bawaan Plotly rapi, tapi jarang cocok dengan branding laporan. update_layout menerima tema, judul, label sumbu, sampai mode hover. Template yang sering saya pakai: plotly_white, plotly_dark, dan simple_white.

python
fig.update_layout(
    template="plotly_white",
    title=dict(text="Penjualan 6 Bulan", x=0.5),
    xaxis_title="Bulan",
    yaxis_title="Nilai (juta Rupiah)",
    hovermode="x unified",
)
fig.show()

Ekspor ke HTML dan Embed di Dashboard

Grafik interaktif baru terasa manfaatnya saat bisa dibagikan. fig.write_html menyimpan seluruh grafik — data, layout, dan JavaScript interaksinya — ke satu file HTML mandiri. Tidak butuh server, tidak butuh Python di sisi penerima.

python
fig.write_html("penjualan.html")

Kirim file itu lewat email atau chat, dan penerima tinggal membukanya di browser dengan semua interaksi tetap jalan. Kalau kamu sedang membangun dashboard, Streamlit punya st.plotly_chart untuk menampilkan figure Plotly langsung di halaman.

python
# di dalam app Streamlit
import streamlit as st
st.plotly_chart(fig)

Untuk berbagi ke orang non-teknis, jangan kirim screenshot. Pakai fig.write_html("file.html") lalu kirim filenya. Zoom, hover, dan toggle legend tetap berfungsi, dan ukuran file biasanya di bawah 2 MB untuk dataset kecil.

Mulai dari yang kecil: ambil satu DataFrame yang sedang kamu garap, ganti px.line dengan px.bar atau px.scatter, lalu simpan ke HTML dan kirim ke rekan kerjamu. Dari situ tinggal selangkah lagi menuju dashboard penuh atau laporan analisis yang lebih dalam.