Idenya
Grafik default berbicara dengan nama kolom: revenue, order_date, qty_sold. Audiensmu berbicara dengan "Revenue (Rp)", "Tanggal order" dan "Unit terjual". Perbedaan antara grafik yang hanya dilirik orang dan yang dipercaya sering kali hanya soal label, format angka dan kotak hover yang baik. Ketiganya cukup satu atau dua baris.
import pandas as pd
import plotly.express as px
sales = pd.read_csv("sales.csv")
completed = sales[sales["status"] == "completed"]
monthly = (completed.assign(month=completed["order_date"].str[:7])
.groupby("month", as_index=False)
.agg(revenue=("revenue", "sum"), orders=("order_id", "nunique")))
print(monthly)
month revenue orders
0 2024-01 1693000 6
1 2024-02 1752000 4
2 2024-03 1027000 2
3 2024-04 3987000 7
4 2024-05 2552000 5
5 2024-06 825000 2
labels=: ganti nama kolom untuk grafik
Express memakai nama kolom sebagai judul sumbu, judul legenda dan label hover. labels= memetakan nama kolom ke nama tampilan, di semua tempat sekaligus:
fig = px.bar(monthly, x="month", y="revenue",
labels={"month": "Month", "revenue": "Revenue (Rp)"},
title="Completed revenue per month")
fig.show()
print(fig.layout.xaxis.title.text, "|", fig.layout.yaxis.title.text)
Month | Revenue (Rp)
Utamakan labels= daripada mengganti nama kolom DataFrame hanya demi sebuah grafik: datamu tetap memakai nama yang ramah kode, dan grafiknya mendapat nama yang manusiawi.
Kamu juga bisa mengatur judul setelah figure dibuat, yang juga berfungsi untuk figure Graph Objects:
fig.update_xaxes(title_text="Month (2024)")
fig.update_yaxes(title_text="Revenue (Rupiah)")
Format angka di sumbu
Plotly secara default menulis 4.000.000 sebagai 4M. Untuk audiens yang memakai Rupiah, mungkin kamu ingin pemisah ribuan dan awalan. tickformat memakai bahasa mini yang sama dengan format text_auto di modul sebelumnya:
| Format | 3987000 tampil sebagai | Dipakai untuk |
|---|---|---|
"," | 3,987,000 | angka penuh dengan pemisah |
".2s" | 4.0M | ringkas |
".1%" | (dari 0.237) 23.7% | porsi yang disimpan sebagai pecahan |
"d" | 3987000 | integer polos |
fig = px.bar(monthly, x="month", y="revenue",
labels={"month": "Month", "revenue": "Revenue"})
fig.update_yaxes(tickprefix="Rp ", tickformat=",")
fig.show()
print(repr(fig.layout.yaxis.tickprefix), repr(fig.layout.yaxis.tickformat))
'Rp ' ','
tickprefix dan ticksuffix menambahkan teks sebelum atau sesudah setiap label tick, seperti "Rp " atau " units".
Plotly memakai koma gaya Inggris sebagai pemisah ribuan. Konvensi Indonesia memakai titik (Rp 3.987.000). Untuk mengubah seluruh grafik, atur fig.update_layout(separators=",."): karakter pertama adalah tanda desimal, yang kedua pemisah ribuan.
Urutan kategori
Kategori di sumbu muncul sesuai urutan data, atau secara alfabetis. Paksa urutannya dengan category_orders:
by_channel = completed.groupby("channel", as_index=False)["revenue"].sum()
fig = px.bar(by_channel, x="channel", y="revenue",
category_orders={"channel": ["web", "app"]})
fig.show()
Berguna untuk urutan alami yang tidak alfabetis: hari dalam seminggu, ukuran (S, M, L), rating, atau "Q1, Q2, Q3, Q4".
Teks hover: apa yang muncul saat kursor diarahkan
Kotak hover adalah tempat grafik interaktif mengalahkan grafik statis. Express secara default menampilkan nilai x dan y. Tambahkan konteks dengan hover_name (judul tebal) dan hover_data (baris tambahan):
fig = px.scatter(monthly, x="orders", y="revenue", hover_name="month",
hover_data={"orders": True, "revenue": ":,"},
labels={"orders": "Orders", "revenue": "Revenue (Rp)"})
fig.show()
hover_name="month"menaruh bulan dengan huruf tebal di bagian atas.hover_dataadalah dict:Truemenampilkan sebuah kolom,Falsemenyembunyikannya, dan format string seperti":,"memformatnya (titik dua memulai format-nya).
hovertemplate: kendali penuh
Untuk kendali penuh, tulis sendiri teks hover-nya dengan hovertemplate. Nilai disisipkan dengan %{...}:
fig = px.bar(monthly, x="month", y="revenue")
fig.update_traces(hovertemplate="<b>%{x}</b><br>Revenue: Rp %{y:,}<extra></extra>")
fig.show()
print(fig.data[0].hovertemplate)
<b>%{x}</b><br>Revenue: Rp %{y:,}<extra></extra>
%{x}dan%{y:,}menyisipkan nilai, dengan format opsional setelah titik dua.<br>adalah baris baru,<b>...</b>huruf tebal.<extra></extra>menghapus kotak abu-abu berisi nama trace yang kalau tidak akan muncul di samping hover.
Untuk menampilkan kolom yang tidak ada di sumbu, berikan sebagai custom_data di Express dan rujuk sebagai %{customdata[0]}:
fig = px.bar(monthly, x="month", y="revenue", custom_data=["orders"])
fig.update_traces(hovertemplate="%{x}: Rp %{y:,} from %{customdata[0]} orders<extra></extra>")
fig.show()
Mengapa ini penting untuk kode yang bersih
Label adalah antarmuka pengguna dari analisismu. Grafik berjudul "revenue by month" dengan sumbu bertuliskan 4M mengundang pertanyaan "4 juta apa?" Grafik yang bersih menjawab pertanyaan sebelum diajukan: apa yang diukur, dalam satuan apa, pada periode apa. Taruh format-nya di beberapa baris eksplisit setelah pemanggilan px, supaya "apa" (data) dan "tampilannya" (label) tetap terpisah dan mudah diubah.
Rangkuman
labels={"col": "Nice name"}mengganti nama kolom di sumbu, legenda dan hover sekaligus.update_xaxes(title_text=...)/update_yaxes(...)mengatur judul di figure mana pun.tickformat(",",".2s",".1%"),tickprefix,ticksuffixmemformat angka di sumbu;separators=",."beralih ke gaya Indonesia.category_orders={"col": [...]}menetapkan urutan kategori.hover_name,hover_datamenambah konteks;hovertemplatedengan%{x},%{y:,},%{customdata[0]}memberi kendali penuh.