DataLens

Menyesuaikan layout (judul, legenda, margin)

Atur judul dan subjudul, posisi legenda, ukuran dan margin, hover terpadu, dan beri anotasi pada inti grafik dengan garis dan catatan.

Level: Menengah · 7 menit baca

Latihan modul ini

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

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

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

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

Setiap garis atau persegi panjang adalah shape di layout, dan setiap teks adalah anotasi.

Ide utama

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 mengubahPakaiContoh
hal-hal di sekitar tandaupdate_layoutjudul, legenda, ukuran, margin, hovermode, font
tanda-tandanya sendiriupdate_tracesketebalan garis, ukuran marker, warna, hovertemplate
satu sumbuupdate_xaxes / update_yaxesjudul, 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

Latihan modul ini

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