Idenya
Express sudah benar menggambar tanda-tandanya. Layout (semua yang ada di sekitar tanda-tanda itu) menentukan apakah grafik terbaca seperti draf atau laporan yang selesai: judul yang menyatakan temuannya, legenda yang tidak mencuri tempat, margin yang pas untuk ubin dashboard, dan catatan yang menunjuk lonjakan yang pasti akan ditanyakan semua orang.
Semuanya lewat satu method, fig.update_layout(...), ditambah beberapa fungsi bantu untuk garis dan anotasi.
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", "channel"], as_index=False)["revenue"].sum())
fig = px.line(monthly, x="month", y="revenue", color="channel", markers=True)
fig.show()
Judul yang menyatakan sesuatu
Judul bisa menyatakan temuan alih-alih topik, dengan subjudul yang lebih kecil untuk detailnya:
fig.update_layout(
title=dict(
text="Web drove the April peak<br><sup>Completed revenue per month and channel, 2024 (Rp)</sup>",
x=0, xanchor="left",
)
)
fig.show()
print(fig.layout.title.x, fig.layout.title.xanchor)
0 left
<br>memutus baris;<sup>membuat baris kedua berukuran kecil, subjudul sederhana.x=0, xanchor="left"menyejajarkan judul dengan tepi kiri, tempat orang mulai membaca.
Notasi titik: garis bawah ajaib
Properti layout itu bersarang: judul punya font, yang punya ukuran. Kamu bisa menulis struktur bersarang itu sebagai dict, atau dengan garis bawah:
fig.update_layout(title_font_size=22, xaxis_title="Month", yaxis_title="Revenue (Rp)")
print(fig.layout.title.font.size, fig.layout.xaxis.title.text)
22 Month
title_font_size=22 adalah singkatan dari title=dict(font=dict(size=22)). Kedua gaya ada di mana-mana di kode Plotly; garis bawah praktis untuk satu atau dua pengaturan.
Legenda
Secara default legenda berada di kanan dan mengambil tempat dari area grafik. Legenda horizontal di atas grafik sering lebih bersih:
fig.update_layout(
legend=dict(orientation="h", yanchor="bottom", y=1.02, xanchor="right", x=1, title_text=""),
)
fig.show()
print(fig.layout.legend.orientation, fig.layout.legend.y)
h 1.02
Koordinatnya berupa pecahan dari area grafik: y=1.02 tepat di atas bagian atas, x=1 dengan xanchor="right" menyejajarkannya dengan tepi kanan. showlegend=False menyembunyikannya sepenuhnya, yang tepat saat hanya ada satu seri, atau saat kamu memberi label pada garis secara langsung.
Ukuran dan margin
Plotly memilih sebuah ukuran dan menyisakan ruang kosong yang lega di sekitar grafik. Untuk laporan atau slide kamu mungkin ingin ukuran yang tetap, dan di kotak dashboard yang kecil kamu pasti ingin margin yang jauh lebih rapat supaya grafiknya sendiri mendapat ruang:
fig.update_layout(width=700, height=400, margin=dict(l=40, r=20, t=80, b=40))
print(fig.layout.margin.l, fig.layout.height)
40 400
Biarkan width kosong di dashboard dan aplikasi, supaya grafik mengisi wadahnya. Margin yang ketat penting di ubin dashboard yang kecil, di mana default Plotly membuang banyak ruang.
Hover terpadu
Untuk time series dengan beberapa garis, satu kotak hover yang mendaftar semua seri di x tersebut lebih mudah dibaca daripada kotak-kotak terpisah:
fig.update_layout(hovermode="x unified")
fig.show()
Menunjuk ceritanya: garis, area, catatan
Grafik menunjukkan apa yang terjadi, tapi pembaca tetap harus mencari tahu kenapa itu penting. Apakah April bagus? Dibandingkan dengan apa? Garis target, pita berarsir untuk periode promo, dan catatan pada lonjakan besar menjawab pertanyaan-pertanyaan itu langsung di grafiknya:
fig.add_hline(y=2000000, line_dash="dash", line_color="gray",
annotation_text="Monthly target", annotation_position="top left")
fig.add_vrect(x0="2024-03", x1="2024-05", fillcolor="#5669FD", opacity=0.08, line_width=0,
annotation_text="Ramadan promo", annotation_position="top right")
fig.add_annotation(x="2024-04", y=2963000, text="USB-C Hub orders", showarrow=True, arrowhead=2)
fig.show()
print(len(fig.layout.shapes), len(fig.layout.annotations))
2 3
add_hline/add_vline: garis referensi melintasi grafik (target, rata-rata, tanggal peluncuran).add_hrect/add_vrect: pita berarsir (periode promo, rentang normal).add_annotation: catatan di sebuah titik data, dengan panah opsional.
Setiap garis atau persegi panjang adalah shape di layout, dan setiap teks adalah anotasi.
Beri anotasi pada satu atau dua hal yang wajib diperhatikan pembaca. Grafik dengan periode promo yang disorot dan lonjakan yang diberi label menjawab pertanyaan sebelum rapat dimulai.
update_layout vs update_traces
| Untuk mengubah | Pakai | Contoh |
|---|---|---|
| hal-hal di sekitar tanda | update_layout | judul, legenda, ukuran, margin, hovermode, font |
| tanda-tandanya sendiri | update_traces | ketebalan garis, ukuran marker, warna, hovertemplate |
| satu sumbu | update_xaxes / update_yaxes | judul, rentang, format tick, garis grid |
fig.update_traces(line_width=3, marker_size=8)
print(fig.data[0].line.width, fig.data[0].marker.size)
3 8
Mengapa ini penting untuk kode yang bersih
Kode format cepat membengkak. Jaga tetap mudah dibaca dengan mengelompokkan pengaturan ke beberapa pemanggilan update_* dalam urutan tetap (layout, sumbu, trace, anotasi), masing-masing dengan tujuan yang jelas. Saat pengaturan yang sama muncul di setiap grafik, pindahkan ke sebuah fungsi atau template, yang menjadi bahasan dua modul berikutnya.
Rangkuman
update_layout(title=dict(text=..., x=0, xanchor="left"));<br><sup>...</sup>menambahkan subjudul.- Garis bawah ajaib:
title_font_size=22=title=dict(font=dict(size=22)). - Legenda:
legend=dict(orientation="h", y=1.02, x=1, xanchor="right", yanchor="bottom"), ataushowlegend=False. width,height,margin=dict(l, r, t, b)mengatur ukuran grafik; biarkan width kosong di aplikasi.hovermode="x unified"untuk time series dengan banyak garis.add_hline,add_vline,add_hrect,add_vrect,add_annotationmenunjuk ceritanya.update_layoutuntuk sekeliling,update_tracesuntuk tanda,update_xaxes/update_yaxesuntuk sumbu.