DataLens

Judul sumbu, label, dan teks hover

Ganti nama kolom mentah dengan label yang manusiawi, format angka sebagai Rupiah dan persentase, dan buat kotak hover menyebutkan tepat hal yang penting.

Level: Dasar · 7 menit baca

Latihan modul ini

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

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:

Format3987000 tampil sebagaiDipakai untuk
","3,987,000angka penuh dengan pemisah
".2s"4.0Mringkas
".1%"(dari 0.237) 23.7%porsi yang disimpan sebagai pecahan
"d"3987000integer 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".

Tips

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()

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>

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

Latihan modul ini

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

Berikutnya: Encoding warna, ukuran, dan simbol →