Harga cabai naik menjelang hari besar, penjualan es kopi melonjak saat cuaca panas, jumlah pelanggan tumbuh sejak promo dibuka — semuanya adalah cerita tentang perubahan sepanjang waktu. Sumbu waktu memberi analisis daya cerita yang tidak dimiliki kategori biasa: urutannya bermakna, jarak antar titik bermakna, dan pola musim bisa berulang. Pada chapter ini kita menggambar deret waktu dengan garis dan penanda, menyandingkan beberapa kota dalam satu bidang, menyorot periode penting dengan pita warna, lalu merapikan label sumbu tanggal agar terbaca nyaman.
Mengapa Waktu Istimewa #
Deret waktu (time series) adalah data yang setiap pengamatannya memiliki penanda waktu: tanggal, pekan, atau jam. Grafik andalannya tetap line chart — sumbu mendatar menampung waktu, sumbu tegak menampung nilainya — tetapi ada beberapa keistimewaan yang menuntut perlakuan khusus. Pertama, tipe data tanggal perlu diurai dengan benar agar jarak antar titik tergambar proporsional, bukan sekadar teks “05 Jan” yang kebetulan berurutan. Kedua, label sumbu tanggal cepat bertumpuk sehingga perlu diformat atau diputar. Ketiga, periode tertentu — musim, hari besar, insiden — sering perlu ditandai agar pembaca tahu bagian mana dari garis yang penting.
Data latihan kita adalah harga cabai merah mingguan di tiga kota, tersimpan sebagai berkas harga_cabai.csv:
pekan,bandung,surabaya,medan
2026-01-05,38,36,32
2026-01-12,40,37,33
2026-01-19,45,41,35
2026-01-26,52,47,38
2026-02-02,60,55,41
2026-02-09,68,62,45
2026-02-16,65,58,43
2026-02-23,55,50,40
2026-03-02,48,45,37
2026-03-09,44,42,35
2026-03-16,42,40,34
2026-03-23,40,39,33Dua belas pekan mulai awal Januari sampai akhir Maret 2026, satu kolom per kota, harga dalam ribu rupiah per kilogram. Cerita di balik angkanya sengaja realistis: puncak musim hujan di akhir Januari sampai Februari menekan pasokan sehingga harga menanjak, lalu mereda ketika panen membaik.
Membaca Data Tanggal dengan pandas #
Langkah pertama setiap visualisasi deret waktu adalah memastikan kolom tanggal benar-benar bertipe tanggal — bukan teks. pandas menyediakan tipe datetime64 untuk itu:
import pandas as pd
harga = pd.read_csv("harga_cabai.csv")
harga["pekan"] = pd.to_datetime(harga["pekan"])
print(harga.head(3).to_string(index=False))
print()
print("Tipe kolom pekan :", harga["pekan"].dtype)
print("Jumlah pekan :", len(harga))
print("Rentang data :", harga["pekan"].min().date(), "sampai",
harga["pekan"].max().date())Output yang Dihasilkan:
pekan bandung surabaya medan
2026-01-05 38 36 32
2026-01-12 40 37 33
2026-01-19 45 41 35
Tipe kolom pekan : datetime64[ns]
Jumlah pekan : 12
Rentang data : 2026-01-05 sampai 2026-03-23Mari kita telaah baris-barisnya:
- Baris 3 (
pd.read_csv(...)): berkas dibaca seperti biasa; kolompekanawalnya berupa teks karenaread_csv()tidak bisa memastikan niat kita. - Baris 4 (
pd.to_datetime(...)): kolom teks diubah menjadi tipedatetime64[ns]— pengubah utama yang wajib ada sebelum menggambar deret waktu; tanpa ini, sumbu x diperlakukan sebagai kategori teks dan jarak waktu menjadi tidak proporsional. - Baris 10-11 (
.min().date()/.max().date()): sekali kolom bertipe tanggal, kita bisa mengambil rentangnya — pemeriksaan cepat bahwa data lengkap dan bebas dari tanggal ganjil.
Satu Deret: Garis dengan Penanda #
Kita mulai dari satu kota. Grafik deret waktu yang sehat menampilkan garis sebagai pembawa tren dan penanda titik sebagai pembawa nilai — dua belas titik masih sedikit, sehingga penanda justru membantu pembacaan:
import matplotlib.pyplot as plt
import pandas as pd
harga = pd.read_csv("harga_cabai.csv")
harga["pekan"] = pd.to_datetime(harga["pekan"])
fig, ax = plt.subplots(figsize=(7, 3.5))
ax.plot(harga["pekan"], harga["bandung"], marker="o", color="tab:red")
ax.set_title("Harga Cabai Merah di Bandung")
ax.set_xlabel("Pekan")
ax.set_ylabel("Harga (ribu rupiah per kg)")
ax.grid(True)
fig.autofmt_xdate()
plt.show()Grafik yang muncul berupa satu garis merah dengan dua belas penanda lingkaran yang naik perlahan dari 38 ribu rupiah pada awal Januari, menanjak makin curam melalui 52 dan 60, sampai puncak 68 ribu pada pekan 9 Februari — hampir dua kali lipat harga awal. Setelah puncak, garis menurun bertahap melalui 55 dan 48, lalu mendingin di kisaran 40-42 ribu pada Maret. Label sumbu mendatar tertulis sebagai tanggal yang diputar miring oleh fig.autofmt_xdate() — satu baris yang menyelamatkan label tanggal dari saling menindih.
Beberapa Kota dalam Satu Bidang #
Pertanyaan yang lebih menarik biasanya membandingkan beberapa deret sekaligus: apakah lonjakan harga terjadi di semua kota, atau hanya di salah satunya? Setiap kota menjadi satu panggilan plot() dengan warna dan bentuk penanda berbeda:
import matplotlib.pyplot as plt
import pandas as pd
harga = pd.read_csv("harga_cabai.csv")
harga["pekan"] = pd.to_datetime(harga["pekan"])
fig, ax = plt.subplots(figsize=(7, 3.5))
ax.plot(harga["pekan"], harga["bandung"], marker="o", color="tab:red", label="Bandung")
ax.plot(harga["pekan"], harga["surabaya"], marker="s", color="tab:orange", label="Surabaya")
ax.plot(harga["pekan"], harga["medan"], marker="^", color="tab:blue", label="Medan")
ax.set_title("Harga Cabai Merah di Tiga Kota")
ax.set_xlabel("Pekan")
ax.set_ylabel("Harga (ribu rupiah per kg)")
ax.grid(True)
ax.legend(title="Kota")
fig.autofmt_xdate()
plt.show()Gambar yang dihasilkan memuat tiga garis yang bergerak seiring: Bandung (merah, penanda lingkaran) selalu paling tinggi dengan puncak 68, Surabaya (oranye, penanda kotak) mengikuti di bawahnya dengan puncak 62, dan Medan (biru, penanda segitiga) paling landai dengan puncak 45. Ketiganya menanjak dan turun pada pekan yang sama — kejadian puncak musim hujan tampak serentak di ketiga kota, dengan Medan yang kenaikannya paling kecil. Penanda berbeda bentuk membuat ketiganya tetap terbedakan meski grafik dicetak tanpa warna.
Menyorot Periode dan Memformat Sumbu Tanggal #
Bagian terpenting dari grafik kadang bukan garisnya, melainkan rentang waktunya: musim panen, hari besar, atau periode kebijakan tertentu. axvspan() menggambar pita warna di belakang garis untuk menandainya, sementara mdates.DateFormatter mengatur bentuk label tanggal:
import matplotlib.pyplot as plt
import matplotlib.dates as mdates
import pandas as pd
harga = pd.read_csv("harga_cabai.csv")
harga["pekan"] = pd.to_datetime(harga["pekan"])
fig, ax = plt.subplots(figsize=(7, 3.5))
ax.plot(harga["pekan"], harga["bandung"], marker="o", color="tab:red", label="Bandung")
ax.plot(harga["pekan"], harga["surabaya"], marker="s", color="tab:orange", label="Surabaya")
ax.plot(harga["pekan"], harga["medan"], marker="^", color="tab:blue", label="Medan")
ax.axvspan(pd.Timestamp("2026-01-26"), pd.Timestamp("2026-02-23"),
color="gray", alpha=0.2, label="puncak musim hujan")
ax.set_title("Harga Cabai Merah di Tiga Kota")
ax.set_xlabel("Pekan")
ax.set_ylabel("Harga (ribu rupiah per kg)")
ax.grid(True)
ax.legend(title="Kota")
ax.xaxis.set_major_formatter(mdates.DateFormatter("%d %b"))
fig.autofmt_xdate()
plt.show()Gambar yang muncul memuat tiga garis yang sama seperti sebelumnya, kini dengan pita kelabu transparan membentang dari 26 Januari sampai 23 Februari di belakangnya — persis rentang ketika harga menanjak paling curam. Mata pembaca dibawa ke pita itu, lalu melihat ketiga garis memuncak di dalamnya, tanpa perlu membaca paragraf penjelasan. Label tanggal juga berubah format menjadi ringkas seperti “05 Jan” berkat DateFormatter("%d %b"), sehingga label miring yang dihasilkan autofmt_xdate() tidak lagi memakan ruang.
Dua keputusan pada blok tersebut: pd.Timestamp("2026-01-26") membuat satu titik tanggal yang bisa langsung diterima sumbu bertipe tanggal, dan alpha=0.2 membuat pita tembus pandang agar garis di depannya tetap terbaca jelas.
Rangkuman #
- Deret waktu menempatkan tanggal pada sumbu mendatar; kolom tanggal wajib diubah ke tipe
datetime64denganpd.to_datetime()sebelum digambar agar jarak waktu proporsional. - Garis membawa tren, penanda titik membawa nilai;
fig.autofmt_xdate()memutar label tanggal agar tidak bertumpuk. - Beberapa deret disandingkan dengan warna dan bentuk penanda yang berbeda; batasi empat-lima garis per bidang gambar.
axvspan()menyorot periode penting sebagai pita transparan di belakang garis;mdates.DateFormattermengatur format label tanggal.
Sepanjang chapter ini sumbu tegak kita berisi angka — harga dalam ribu rupiah. Padahal tidak sedikit data yang nilainya kategori: metode pembayaran, jenis menu, kota asal pelanggan. Chapter berikutnya, Visualisasi Data Kategorikal, mengurus proporsi dan susunan kategori tersebut.
Referensi #
- Pandas — User Guide: Time Series — panduan resmi pengolahan tanggal dan deret waktu di pandas.
- Pandas — Intro Tutorials
— tutorial dasar pandas termasuk
read_csv()dan konversi kolom. - Matplotlib — User’s Guide — panduan resmi matplotlib, termasuk penanganan sumbu tanggal.