Idenya
Plotly adalah library grafik yang dipakai kursus ini untuk grafik interaktif: setiap grafik bisa di-hover, di-zoom dan diunduh, di notebook, aplikasi Streamlit atau halaman web. Ada dua cara untuk membangun grafik:
- Plotly Express (
import plotly.express as px): satu pemanggilan fungsi per grafik, langsung dari DataFrame pandas. Cepat, dengan default yang masuk akal. - Graph Objects (
import plotly.graph_objects as go): bangun grafik sepotong demi sepotong. Kodenya lebih banyak, kendalinya penuh.
Keduanya bukan saingan. Express dibangun di atas Graph Objects: setiap fungsi px mengembalikan figure Graph Objects. Jadi keterampilan sebenarnya adalah mengetahui kapan Express sudah cukup, dan cara masuk ke dalam figure saat belum cukup.
Grafik yang sama, dua kali
Revenue per kategori, cara Express:
import pandas as pd
import plotly.express as px
by_category = pd.DataFrame({
"category": ["Electronics", "Kitchen", "Coffee", "Home", "Stationery"],
"revenue": [5113000, 2610000, 1805000, 1560000, 748000],
})
fig = px.bar(by_category, x="category", y="revenue", title="Completed revenue by category")
fig.show()
Cara Graph Objects:
import plotly.graph_objects as go
fig = go.Figure(
data=[go.Bar(x=by_category["category"], y=by_category["revenue"])],
layout=go.Layout(title="Completed revenue by category"),
)
fig.show()
Tekan Try it pada keduanya: grafiknya hampir identik. Perbedaannya ada di cara kamu mendeskripsikannya:
- Express menerima DataFrame dan nama kolom. Ia mengurus sisanya: judul sumbu dari nama kolom, label hover, warna.
- Graph Objects menerima array nilai di dalam sebuah trace (
go.Bar) dan sebuah layout. Tidak ada yang otomatis: perhatikan grafik Graph Objects tidak punya judul sumbu sampai kamu menambahkannya.
Dari apa sebuah figure dibuat
Setiap figure Plotly, bagaimanapun cara membuatnya, punya dua bagian yang sama:
fig = px.bar(by_category, x="category", y="revenue")
print(type(fig).__name__)
print(len(fig.data), fig.data[0].type)
print(fig.layout.xaxis.title.text, "|", fig.layout.yaxis.title.text)
Figure
1 bar
category | revenue
| Bagian | Berisi | Contoh |
|---|---|---|
fig.data | list trace: tanda-tandanya (bar, garis, titik) dan nilainya | satu trace bar |
fig.layout | semua yang ada di sekitar tanda-tanda itu: judul, sumbu, legenda, warna, ukuran | judul sumbu category, revenue |
Figure Plotly hanyalah deskripsi terstruktur (data + layout) yang digambar oleh browser. Express menuliskan deskripsi itu untukmu; Graph Objects membiarkanmu menuliskannya sendiri. Bagaimanapun caranya, kamu bisa mengubah bagian mana pun sesudahnya.
Poin terakhir itu yang paling praktis. Mulai dengan Express, lalu sesuaikan figure-nya dengan method seperti update_layout, update_traces dan add_trace:
fig = px.bar(by_category, x="category", y="revenue", title="Completed revenue by category")
fig.add_trace(go.Scatter(x=by_category["category"], y=[2000000] * 5,
mode="lines", name="Target"))
fig.update_layout(yaxis_title="Revenue (Rp)")
fig.show()
Grafik bar Express, ditambah garis Graph Objects untuk target, ditambah sedikit penyesuaian layout. Gaya "Express dulu, lalu sesuaikan" inilah tampilan sebagian besar kode Plotly profesional.
Express menyukai data tidy
Express paling cepat saat DataFrame-mu tidy (disebut juga long): satu baris per observasi, satu kolom per variabel. Bandingkan dua bentuk dari angka yang sama:
wide = pd.DataFrame({
"month": ["Jan", "Feb", "Mar"],
"web": [1200, 1100, 900],
"app": [500, 650, 640],
})
long = wide.melt(id_vars="month", var_name="channel", value_name="revenue")
print(wide)
print(long)
month web app
0 Jan 1200 500
1 Feb 1100 650
2 Mar 900 640
month channel revenue
0 Jan web 1200
1 Feb web 1100
2 Mar web 900
3 Jan app 500
4 Feb app 650
5 Mar app 640
Dengan versi long, satu pemanggilan Express menggambar satu garis per channel, diberi warna dan label secara otomatis:
fig = px.line(long, x="month", y="revenue", color="channel", markers=True)
fig.show()
color="channel" berarti "pisahkan data berdasarkan kolom ini". Itu hanya berfungsi saat "channel" memang sebuah kolom, dan itulah sebabnya melt (dari modul reshaping pandas) adalah langkah persiapan paling umum sebelum grafik Express.
Kapan memakai yang mana
| Situasi | Pakai |
|---|---|
| Menjelajahi data, grafik standar (bar, line, scatter, histogram, box) | Express |
| Data ada di DataFrame yang tidy | Express |
| Grafik standar yang butuh sedikit penyesuaian | Express, lalu update_* / add_trace |
| Mencampur trace yang tidak biasa, membangun grafik trace demi trace | Graph Objects |
| Nilai tidak ada di DataFrame, atau butuh kendali presisi atas setiap trace | Graph Objects |
| Subplot dengan jenis grafik berbeda, dropdown, interaktivitas khusus | Graph Objects (modul-modul selanjutnya) |
Mulai dengan Express hampir setiap saat. Beralih ke Graph Objects saat Express tidak bisa mengungkapkannya.
Mengapa ini penting untuk kode yang bersih
Grafik juga kode, dan aturannya sama: versi jelas yang paling pendek yang menang. Satu pemanggilan px pada DataFrame yang tidy lebih mudah dibaca dan diubah daripada empat puluh baris membangun trace. Pisahkan persiapan data (memfilter, melt, agregasi) dari pembuatan grafik, supaya setiap langkah melakukan satu hal.
Rangkuman
px(Express) membangun grafik dari DataFrame dalam satu pemanggilan;go(Graph Objects) membangunnya dari trace.- Setiap fungsi
pxmengembalikango.Figure; kamu bisa mengubahnya sesudahnya. - Sebuah figure =
fig.data(trace) +fig.layout(selebihnya). - Express bekerja paling baik dengan data tidy/long; pakai
meltuntuk sampai ke sana;color=memisahkan berdasarkan sebuah kolom. - Default ke Express; sesuaikan dengan
update_layout,update_traces,add_trace; pakai Graph Objects untuk kendali penuh.