DataLens

Plotly Express vs Graph Objects: kapan memakai yang mana

Pahami dua lapisan Plotly, apa sebenarnya sebuah figure, dan bentuk data tidy yang membuat grafik Express cukup satu baris.

Level: Dasar · 8 menit baca

Latihan modul ini

Soal-soal untuk pelajaran ini berjalan di browser-mu dan langsung mengecek jawabanmu.

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:

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:

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
BagianBerisiContoh
fig.datalist trace: tanda-tandanya (bar, garis, titik) dan nilainyasatu trace bar
fig.layoutsemua yang ada di sekitar tanda-tanda itu: judul, sumbu, legenda, warna, ukuranjudul sumbu category, revenue
Ide utama

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

SituasiPakai
Menjelajahi data, grafik standar (bar, line, scatter, histogram, box)Express
Data ada di DataFrame yang tidyExpress
Grafik standar yang butuh sedikit penyesuaianExpress, lalu update_* / add_trace
Mencampur trace yang tidak biasa, membangun grafik trace demi traceGraph Objects
Nilai tidak ada di DataFrame, atau butuh kendali presisi atas setiap traceGraph Objects
Subplot dengan jenis grafik berbeda, dropdown, interaktivitas khususGraph 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

Latihan modul ini

Soal-soal untuk pelajaran ini berjalan di browser-mu dan langsung mengecek jawabanmu.

Berikutnya: Grafik pertamamu: line dan scatter dengan px →