Tidak ada satu pun pustaka Python charting yang benar-benar "terbaik", dan siapa pun yang mengatakan sebaliknya pasti sedang menjual sesuatu. Jawaban yang jujur adalah bahwa bidang ini terbagi menjadi segelintir perkakas yang masing-masing unggul untuk pekerjaan tertentu: plot statis berkualitas publikasi, grafik statistik satu baris, dasbor interaktif, spesifikasi deklaratif yang bisa dikelola dalam version control, atau grafik yang harus mampu bertahan menampung seratus juta titik. Ulasan ini menelusuri pustaka yang penting, apa keunggulan sejati masing-masing, di mana titik lemahnya, dan — karena situs ini berfokus pada membangun di Python untuk pasar — bagaimana masing-masing menangani candlestick dan deret waktu (time series) berukuran besar.

Setiap jumlah bintang, angka unduhan, dan lisensi di bawah ini telah diperiksa terhadap sumber primer (GitHub, PyPI, dokumentasi resmi) pada pertengahan 2026. Bila suatu angka merupakan klaim kasus terbaik versi vendor, hal itu ditandai secara eksplisit.

Bintang GitHub untuk pustaka inti Python charting per pertengahan 2026 — Matplotlib memimpin di ~22.9k, dengan Bokeh, Plotly dan Seaborn mengikuti di belakangnya.

Model mental: statis vs interaktif

Percabangan pertama adalah apakah keluarannya berupa gambar statis (PNG/SVG/PDF, dirender sekali) atau figur interaktif (HTML/JS, geser-zoom-hover di dalam browser).

Percabangan kedua — yang baru terasa begitu data Anda membesar — adalah di mana titik-titiknya digambar: di browser (sisi klien, WebGL) atau diagregasi terlebih dahulu di server menjadi sebuah gambar. Perbedaan itulah inti dari keseluruhan cerita "tier skala" di bagian bawah, dan justru itulah yang paling sering dilewatkan oleh kebanyakan ulasan.

Matplotlib — fondasi yang menopang segalanya

Matplotlib adalah landasan dari plotting di Python. Ia bukan sekadar pustaka; ia adalah mesin render tempat Seaborn, default Plotnine, mplfinance dan selusin pustaka lain dibangun. Lisensinya permisif — secara resmi "berbasis lisensi PSF" dan kompatibel dengan BSD, sehingga Anda bisa menyertakannya ke dalam produk proprietary dan menjualnya tanpa perlu khawatir (dokumentasi lisensi).

Kelebihan. Kendali penuh. Jika Anda bisa mendeskripsikan sebuah tanda pada kanvas 2D, Matplotlib bisa menggambarnya, dan ia mengekspor PDF/SVG vektor yang tajam untuk cetak. Ia terpasang di mana-mana dan setiap galat yang akan Anda temui sudah pasti punya jawaban di Stack Overflow.

Kekurangan. API-nya terkenal berkepala dua — antarmuka pyplot bergaya MATLAB yang stateful dan antarmuka berorientasi objek Figure/Axes — dan tutorial mencampuradukkan keduanya seenaknya, yang persis menjadi alasan mengapa "why you hate matplotlib" menjadi sebuah genre tersendiri. Default-nya ketinggalan zaman, dan menata grafik agar tampak modern membutuhkan baris kode yang tidak sedikit.

import matplotlib.pyplot as plt

fig, ax = plt.subplots(figsize=(10, 4))
ax.plot(df.index, df["close"], lw=1.2)
ax.set_title("BTC-USD daily close")
fig.savefig("btc.png", dpi=150, bbox_inches="tight")

Keluaran Matplotlib — contoh deret harga BTC dengan rata-rata bergerak 20 dan 50 hari ditambah panel volume, digambar sumbu demi sumbu.

Gunakan saat Anda membutuhkan figur statis yang siap cetak, atau Anda sedang membangun perkakas tingkat lebih tinggi dan menginginkan kanvas yang sepenuhnya Anda kendalikan.

Seaborn — grafik statistik tanpa boilerplate

Seaborn adalah lapisan tipis nan opinionated di atas Matplotlib (BSD-3-Clause) yang mengubah sepuluh baris pengaturan axes menjadi satu. Ia "menyediakan antarmuka tingkat tinggi untuk menggambar grafik statistik yang menarik" dan terintegrasi erat dengan pandas — distribusi, regresi, heatmap, dan small-multiple berfaset semuanya cukup satu panggilan.

import seaborn as sns
sns.set_theme()
sns.lineplot(data=returns, x="date", y="ret", hue="symbol")

Keluaran Seaborn — heatmap korelasi imbal hasil aset dalam satu panggilan, jenis grafik statistik yang dibuat sepele oleh Seaborn.

Kelebihan. Default statistik kelas terbaik; cantik langsung dari kotaknya; pilihan pertama yang paling jelas untuk analisis data eksploratif.

Kekurangan. Ia mewarisi sifat statis Matplotlib (tanpa interaktivitas) dan, saat Anda membutuhkan grafik yang tak punya fungsi bawaannya, Anda tetap harus turun ke Matplotlib mentah. Ia adalah lapisan kenyamanan, bukan jalan keluar dari mesin intinya.

Gunakan saat Anda melakukan EDA pada sebuah DataFrame dan ingin heatmap korelasi, distribusi, atau plot regresi dengan cepat.

Plotly — default interaktif

Plotly.py adalah opsi interaktif yang paling banyak diadopsi. Ia berlisensi MIT, dibangun di atas plotly.js, dan angkanya tak tertandingi: kira-kira 18.6k bintang GitHub dan sekitar 1.24 miliar unduhan PyPI sepanjang masa — pada kisaran 61 juta unduhan dalam 30 hari terakhir (PyPI · statistik unduhan). Tooltip hover, zoom, pan, dan toggle legenda hadir secara cuma-cuma, dan figur yang sama dirender di notebook, aplikasi Dash, atau berkas HTML statis.

import plotly.graph_objects as go

fig = go.Figure(go.Candlestick(
    x=df.index, open=df.open, high=df.high, low=df.low, close=df.close,
))
fig.update_layout(title="BTC-USDT", xaxis_rangeslider_visible=False)
fig.show()

Keluaran Plotly — candlestick interaktif dengan rata-rata bergerak 20 hari; pan, zoom, dan hover aktif langsung pada versi browser.

Kelebihan. Interaktivitas tanpa JavaScript sama sekali; tipe grafik finansial kelas satu (go.Candlestick, go.Ohlc); jalan menuju dasbor lengkap (Dash) terbilang singkat.

Kekurangan. Bundel plotly.js berat — biaya nyata bagi situs yang sensitif terhadap waktu muat halaman (analisis waktu bundel). Dan ada batas render yang keras: dengan trace WebGL (go.Scattergl) Anda bisa merepresentasikan hingga ~1 juta titik, tetapi browser hanya mengizinkan 8–16 konteks WebGL per halaman, sehingga dalam praktiknya Anda mendapat 4–8 figur WebGL sebelum menabrak "Too many active WebGL contexts" (dokumentasi performa Plotly). Zoom/pan interaktif yang mulus realistisnya bertahan hingga ~100–200k titik.

Gunakan saat Anda menginginkan grafik atau dasbor interaktif, terutama yang bersifat finansial, dan deret Anda berkisar dari ribuan hingga beberapa juta titik.

Bokeh — interaktif yang dirancang untuk data besar dan streaming

Bokeh (BSD-3-Clause, ~20.4k bintang / 4.3k fork) adalah rival interaktif utama Plotly, dengan pusat gravitasi berbeda: ia adalah "pustaka visualisasi interaktif untuk peramban web modern" yang ditujukan untuk dataset besar dan streaming serta aplikasi berbasis server (server Bokeh dapat mengirim pembaruan langsung ke sebuah grafik melalui websocket).

Satu catatan jujur yang tak akan diberikan oleh pemasaran: "high-performance" sebagian adalah deskripsi diri sendiri. Laporan dari lapangan menunjukkan hover/tooltip mulai tersendat pada dataset sekecil ~50k titik, jadi ia tidak otomatis cepat pada data raksasa — Anda tetap harus beralih ke agregasi (di bawah). Anggaplah keunggulan Bokeh terletak pada streaming dan arsitektur aplikasi, bukan pada jumlah titik mentah.

from bokeh.plotting import figure, show

p = figure(x_axis_type="datetime", title="BTC-USD", height=350)
p.line(df["date"], df["close"])
show(p)

Gunakan saat Anda membangun dasbor yang diperbarui secara langsung atau aplikasi data yang digerakkan Python dan menginginkan kendali sisi server atas interaktivitas.

Altair — tata bahasa grafik deklaratif

Altair adalah pustaka deklaratif: Anda mendeskripsikan apa yang hendak dikodekan (kolom ini ke x, kolom itu ke warna) dan mesin Vega-Lite memutuskan bagaimana menggambarnya. Grafik berupa spesifikasi JSON, sehingga bisa dikomposisikan dan ramah diff.

Keluaran Altair — deret harga yang sama sebagai grafik area-plus-garis deklaratif, dihasilkan dari spesifikasi Vega-Lite yang ringkas.

Jebakan yang ditemui setiap pendatang baru: secara default Altair menolak menggambar lebih dari 5.000 baris, dengan memunculkan MaxRowsError. Ini pembatas yang disengaja (Altair menanamkan datanya sebagai JSON di dalam spesifikasi), bukan ketidakmampuan menangani data — dan cukup satu baris untuk menghapusnya:

import altair as alt
alt.data_transformers.disable_max_rows()   # atau pakai backend VegaFusion untuk ~100k+

alt.Chart(df).mark_line().encode(x="date:T", y="close:Q")

Ini adalah sumber frustrasi yang berulang justru karena galatnya muncul pada frame 35k baris yang terasa "kecil" (dokumentasi dataset besar).

Gunakan saat Anda mementingkan spesifikasi grafik yang ringkas, deklaratif, dan reproducible serta data Anda berukuran sedang — atau Anda bersedia merangkai VegaFusion untuk frame yang lebih besar.

Plotnine dan Pygal — melengkapi daftar

python from plotnine import ggplot, aes, geom_line (ggplot(df, aes("date", "close")) + geom_line())

Keluaran Plotnine — data yang sama dalam gaya tata bahasa grafik ggplot2, langsung terasa akrab bagi siapa pun yang datang dari R.

Saat data Anda membesar: tier skala

Di sinilah pilihan yang naif berguguran. Begitu Anda melewati satu juta titik, Anda tidak bisa begitu saja menyerahkannya ke browser. (Agar tepat soal sebuah mitos: browser bisa merepresentasikan ~1 juta titik WebGL — yang menurun adalah kemulusan interaktif, bukan crash mendadak.) Dua strategi mengatasi ini:

1. Rasterisasi sisi server — Datashader. Alih-alih mengirim titik ke browser, Datashader (BSD-3-Clause) mengelompokkannya ke dalam grid 2D berukuran tetap dan merender grid itu sebagai sebuah gambar, "mempertahankan distribusi data dengan setia." Angka unggulannya: satu miliar titik dalam sekitar satu detik pada laptop 16 GB, dengan kemampuan skala out-of-core dan ke GPU lewat Dask (pengantar · panduan data besar HoloViews). Perlakukan angka miliaran-titik-per-detik itu sebagai kasus terbaik versi vendor — tetapi pendekatannya (mengelompokkan ulang pada setiap zoom/pan) memang benar-benar yang tepat untuk data padat.

import datashader as ds, datashader.transfer_functions as tf

cvs = ds.Canvas(plot_width=900, plot_height=400)
agg = cvs.points(df, "t", "price")     # df bisa berupa frame Dask yang lebih besar dari RAM
img = tf.shade(agg)

2. Downsampling bergantung tampilan — plotly-resampler. Ini mempertahankan interaktivitas penuh Plotly tetapi hanya pernah merender titik yang benar-benar bisa Anda lihat. Agregasi default MinMaxLTTB-nya mereduksi setiap trace menjadi ~1.000 titik tergambar untuk tampilan saat ini, lalu mengambil ulang seiring Anda melakukan zoom — demonya memvisualisasikan lebih dari 110 juta titik data dengan cara ini (makalah).

from plotly_resampler import FigureResampler
import plotly.graph_objects as go

fig = FigureResampler(go.Figure())
fig.add_trace(go.Scattergl(name="price"), hf_x=ts, hf_y=price)  # 100M+ titik
fig.show_dash()

Aturan praktis: scatter/heatmap padat berisi jutaan titik → Datashader; deret waktu interaktif yang panjang → plotly-resampler.

Memetakan data pasar: candlestick dan OHLC

Untuk alur kerja yang berfokus pada trading, yang menonjol adalah mplfinance — paket pemetaan grafik finansial dari organisasi Matplotlib. Ia menerima pandas DataFrame dengan DatetimeIndex dan kolom Open/High/Low/Close lalu menggambar grafik candlestick, OHLC, garis, Renko dan Point & Figure, lengkap dengan rata-rata bergerak dan volume yang sudah tertanam:

import mplfinance as mpf
mpf.plot(df, type="candle", mav=(20, 50), volume=True, style="charles")

Selain mplfinance:

Perbandingan sekilas

Pustaka Tipe Lisensi Interaktif Paling cocok untuk Yang perlu diwaspadai
Matplotlib Statis Kompatibel PSF/BSD Tidak Kendali penuh, cetak/PDF Bertele-tele, default ketinggalan zaman
Seaborn Statis BSD-3 Tidak EDA statistik Turun ke Matplotlib untuk kasus tak lazim
Plotly Interaktif MIT Ya Dasbor, grafik finansial Bundel berat; batas WebGL ~1 juta titik
Bokeh Interaktif BSD-3 Ya Streaming / aplikasi data Tak otomatis cepat pada data besar
Altair Interaktif BSD-3 Ya Spesifikasi deklaratif, reproducible Batas default 5.000 baris
Plotnine Statis MIT Tidak Kebiasaan otot ggplot2 Hanya statis
Pygal SVG Sumber terbuka (LGPL) Ringan Grafik vektor bersih di web Ceruk; bukan untuk data besar
Datashader Raster sisi server BSD-3 Lewat HoloViews 10⁶–10⁹ titik Sebuah gambar, bukan tanda vektor
mplfinance Statis Bergaya BSD (org mpl) Tidak Candlestick / OHLC Statis; pasangkan dengan Plotly untuk interaktivitas

Angka popularitas terverifikasi pertengahan 2026: Plotly ≈18.6k bintang / ≈1.24B unduhan; Bokeh ≈20.4k bintang / 4.3k fork. Jumlah bintang dan unduhan terus berubah — perlakukan sebagai potret sesaat, dan ingat bahwa unduhan PyPI mentah mencakup CI dan mirror, sehingga melebih-lebihkan adopsi manusia.

Cara memilih, dalam satu tarikan napas

Pilihlah yang sesuai dengan pekerjaannya, bukan yang paling banyak bintangnya. Sebagian besar proyek nyata pada akhirnya menggunakan dua atau tiga di antaranya secara bersamaan — Seaborn untuk eksplorasi, Plotly untuk dasbor, mplfinance untuk laporan backtest — dan itulah hasil yang benar, bukan kegagalan dalam menstandarkan.


Metodologi: klaim dalam ulasan ini diperiksa silang terhadap sumber primer (repositori GitHub proyek, PyPI, dan dokumentasi resmi) serta diverifikasi secara adversarial; angka-angka merupakan potret pertengahan 2026. Angka performa yang ditandai sebagai angka vendor (satu miliar titik Datashader, 110M plotly-resampler) adalah kasus terbaik yang reproducible, bukan benchmark independen.