Makie adalah ekosistem visualisasi Julia yang menyusun plot secara deklaratif, yaitu plot dijelaskan sebagai objek beserta atributnya, lalu backend yang dipilih merender hasilnya. Topik ini memperkenalkan tiga backend resmi, membangun plot pertama dengan Figure dan Axis melalui CairoMakie, menambahkan dua seri data dengan atribut garis dan titik, serta membedakan API stateless dan API mutating. Semua contoh menyimpan hasilnya sebagai berkas PNG sehingga dapat dijalankan pada lingkungan tanpa layar.
Ekosistem dan pilihan backend#
Package inti Makie menyediakan abstraksi Scene beserta resep plot seperti lines dan scatter, sedangkan pekerjaan merender diserahkan pada backend yang dipilih. Tiga backend resmi tersedia. GLMakie merender melalui OpenGL pada GPU dan membuka jendela interaktif untuk rotasi serta zoom. CairoMakie merender melalui pustaka Cairo pada CPU dan menghasilkan berkas PNG, PDF, atau SVG. WGLMakie merender melalui WebGL sehingga plotnya tampil pada halaman browser. Diagram berikut memperlihatkan posisi ketiganya.
| Backend | Perenderan | Keluaran | Cocok untuk |
|---|---|---|---|
| GLMakie | OpenGL pada GPU | jendela interaktif | eksplorasi data dengan rotasi dan zoom |
| CairoMakie | Cairo pada CPU | PNG, PDF, SVG | skrip, dokumen, dan server tanpa layar |
| WGLMakie | WebGL pada browser | halaman web interaktif | publikasi visual yang dioperasikan pembaca |
Blok berikut memperlihatkan cara mengaktifkan GLMakie dan menampilkan jendelanya. Blok ini tidak dijalankan karena sandbox tidak menyediakan GPU maupun layar, dan package GLMakie pun tidak terpasang di lingkungan ini.
# tidak-dijalankan
using GLMakie
GLMakie.activate!()
fig = lines(1:10, (1:10) .^ 2)
display(fig)Figure, Axis, dan plot pertama#
Objek Figure adalah wadah paling luar yang berisi panel, legenda, dan elemen lain, sedangkan Axis adalah panel bersumbu yang menampung plot. Posisi Axis pada figure ditulis dengan indeks tata letak seperti fig[1, 1], yaitu baris 1 kolom 1. Atribut seperti title, xlabel, ylabel, dan xticks diteruskan ke konstruktor Axis. Fungsi lines! dan scatter! kemudian menambahkan plot ke axis yang sudah ada, dan save menuliskan figure ke berkas.
# sensor-suhu.jl
# Plot dua seri suhu dengan CairoMakie, disimpan sebagai berkas PNG.
using CairoMakie
hari = 1:7
pagi = [22.5, 23.0, 21.8, 22.4, 23.6, 24.1, 23.2]
siang = [29.4, 30.2, 28.7, 29.9, 31.0, 31.6, 30.5]
fig = Figure(size = (640, 400))
ax = Axis(
fig[1, 1],
title = "Suhu selama satu pekan",
xlabel = "Hari",
ylabel = "Suhu (°C)",
xticks = 1:7,
)
lines!(ax, hari, pagi; label = "Suhu pagi", color = :steelblue)
scatter!(ax, hari, siang; label = "Suhu siang", color = :darkorange, marker = :rect)
axislegend(ax; position = :lt)
dir = mktempdir()
jalur = joinpath(dir, "suhu.png")
save(jalur, fig)
println("plot tersimpan")plot tersimpanDua seri dipilih dengan bentuk berbeda, yaitu garis untuk suhu pagi dan titik untuk suhu siang, sehingga keduanya tetap terbedakan meskipun dicetak hitam-putih. Fungsi axislegend menaruh legenda pada sudut kiri atas axis melalui posisi :lt. Direktori sementara dari mktempdir menampung berkas PNG tanpa meninggalkan sisa pada direktori proyek, dan skrip ini berdiri sendiri sehingga dapat dijalankan dengan julia sensor-suhu.jl.
API stateless dan API mutating#
Setiap resep plot memiliki dua bentuk. Bentuk stateless seperti lines(x, y) membentuk figure, axis, dan plot sekaligus, lalu mengembalikan objek gabungan yang Figure-nya diambil melalui atribut figure. Bentuk mutating seperti lines!(ax, x, y) menambahkan plot ke axis yang sudah ada dan mengembalikan objek plotnya, dengan tanda seru yang mengikuti konvensi fungsi yang memutasi argumennya. Bentuk stateless cocok untuk plot tunggal, sedangkan bentuk mutating cocok untuk menumpuk beberapa seri pada satu axis.
using CairoMakie
x = 1:5
y = [2.0, 3.5, 3.0, 4.5, 5.0]
# stateless: figure, axis, dan plot dibentuk sekali jalan
fig_a = lines(x, y; axis = (title = "Garis tunggal",))
# mutating: axis dibuat lebih dahulu, plot ditambahkan kepadanya
fig_b = Figure(size = (640, 400))
ax = Axis(fig_b[1, 1]; title = "Dua seri pada satu axis", xlabel = "x", ylabel = "y")
lines!(ax, x, y; color = :steelblue, label = "garis")
scatter!(ax, x, y .* 1.1; color = :darkorange, marker = :rect, label = "titik")
axislegend(ax; position = :lt)
save(joinpath(mktempdir(), "a.png"), fig_a.figure)
save(joinpath(mktempdir(), "b.png"), fig_b)
println("dua plot tersimpan")dua plot tersimpanAtribut color menerima simbol seperti :steelblue dan :darkorange, sedangkan marker menentukan bentuk titik, misalnya :rect. Ekspresi y .* 1.1 memperbesar seluruh elemen y secara broadcast sebelum digambar sebagai titik. Kedua hasil tersimpan sebagai PNG pada direktori sementara masing-masing, dan pesan keluarannya hanya menyatakan keberhasilan penyimpanan.
Layout dua panel#
Indeks tata letak pada Figure menerima posisi [baris, kolom], sehingga dua panel berdampingan cukup ditulis fig[1, 1] dan fig[1, 2]. Fungsi plot bermutasi bahkan menerima posisi tersebut secara langsung, misalnya lines!(fig[1, 1], ...), yang membentuk axis pada posisi itu apabila belum ada. Contoh berikut menempatkan suhu dan kelembapan bersebelahan dengan satu panggilan Axis dan satu panggilan lines! per panel.
using CairoMakie
jam = 1:7
suhu = [22.5, 23.0, 21.8, 22.4, 23.6, 24.1, 23.2]
kelembapan = [61.0, 59.5, 63.2, 60.8, 57.4, 55.9, 58.6]
fig = Figure(size = (640, 320))
Axis(fig[1, 1]; title = "Suhu", xlabel = "Jam ke-")
Axis(fig[1, 2]; title = "Kelembapan", xlabel = "Jam ke-")
lines!(fig[1, 1], jam, suhu; color = :steelblue)
lines!(fig[1, 2], jam, kelembapan; color = :forestgreen)
save(joinpath(mktempdir(), "layout.png"), fig)
println("layout dua panel tersimpan")layout dua panel tersimpanKeluarannya hanya pesan keberhasilan karena isi berkas PNG tidak dapat direpresentasikan sebagai teks. Ukuran figure diatur melalui argumen kata kunci size dalam piksel, dan tata letak yang lebih rumit seperti panel bertingkat mengikuti pola indeks yang sama. Pemisahan dua panel seperti ini lazim untuk membandingkan dua besaran yang satuannya berbeda, karena menyatukannya pada satu axis memaksa sumbu yang tidak cocok. Apabila satu panel perlu melintasi dua kolom, posisinya ditulis dalam bentuk rentang seperti fig[1, 1:2]. Bagian layout pada dokumentasi Makie mencakup variasinya secara lengkap.
Kesalahan umum#
- Menjalankan GLMakie pada server tanpa GPU dan tanpa layar. Eksekusinya berhenti karena konteks OpenGL tidak dapat dibuat, sehingga backend CPU seperti CairoMakie menjadi pilihan yang tepat untuk skrip semacam itu.
- Menganggap skrip akan menampilkan figure sebagaimana REPL. Tanpa
save, hasil perenderan hilang bersama berakhirnya skrip, sehinggasave(jalur, fig)dipanggil setiap kali hasilnya perlu diperiksa. - Menulis
lines(ax, x, y)tanpa tanda seru dengan niat menambahkan plot ke axis. Bentuk tanpa tanda seru membentuk figure baru yang terpisah, sehingga plot tidak muncul pada axis yang dituju.
Ringkasan#
- Makie menyusun plot deklaratif pada lapisan inti, lalu menyerahkan perenderan ke backend GLMakie, CairoMakie, atau WGLMakie.
- CairoMakie merender pada CPU dan menyimpan PNG, PDF, atau SVG, sehingga cocok untuk skrip dan lingkungan tanpa layar.
FiguremenampungAxispada posisi[baris, kolom], danlines!atauscatter!menambahkan seri ke axis yang ada.- Bentuk stateless membentuk figure sekaligus plot, sedangkan bentuk mutating dengan tanda seru menambah lapisan pada axis yang sudah ada.
Referensi#
- Makie Documentation — Makie.org
— Dokumentasi resmi
Figure,Axis, fungsi plot, dan atributnya. - Backends — Makie.org — Penjelasan resmi perbedaan GLMakie, CairoMakie, dan WGLMakie.