Semua grafik sejauh ini bersifat statis: kita menggambar, menyimpan, selesai. Padahal saat MENGANALISIS (bukan melapor), kecepatan datang dari interaksi — mengarahkan kursor untuk membaca nilai, men-zoom ke satu wilayah, atau menggeser rentang waktu tanpa menulis ulang kode. MATLAB menyediakan semua itu di desktop; namun skrip otomatis dan server berjalan tanpa display. Chapter ini memisahkan dua dunia tersebut supaya kode kita tetap teruji di lingkungan headless. Cakupan chapter ini:

  • Konsep interaktivitas desktop vs skrip headless
  • Properti figure sebagai fondasi interaksi: Name, Position, Color
  • linkaxes untuk sinkronisasi zoom antar panel
  • Data cursor, ginput, zoom/pan, dan label sumbu terputar

Dua Mode Kerja: Desktop vs Headless #

Aturannya: interaktivitas membutuhkan event loop GUI — klik, geser, dan scroll diproses hanya ketika jendela figur benar-benar tampil. Mekanismenya: pada MATLAB desktop, jendela figur dengan 'visible', 'on' menjalankan loop yang mendengarkan pointer; di skrip batch atau server tanpa display, jendela tidak pernah tampil sehingga satu-satunya keluaran yang bisa diverifikasi adalah berkas dan fprintf.

Karena itu seluruh contoh pada chapter ini — dan seluruh course ini — memakai pola headless: figure('visible', 'off') membuat figur lengkap dengan seluruh propertinya, saveas membuktikan grafik tergambar, dan fprintf melaporkan hasil. Di desktop kita tinggal mengganti 'off' menjadi 'on' untuk mendapatkan jendela interaktif yang persis sama.

Properti Figure #

Setiap figur adalah objek dengan identitas dan geometri yang bisa kita baca-tulis lewat get/set — fondasi semua interaksi karena toolbar, legend, dan callback hidup di dalam figur ini:

PropertiPeranContoh nilai
Namejudul jendela'Dasbor Penjualan Budi'
NumberTitlenomor “Figure 1” di depan judul'off' menyembunyikannya
Position[left bottom width height] piksel[100 100 900 500]
Colorwarna latar figur[1 1 1] putih
visiblejendela tampil atau tidak'off' untuk uji headless

Berikut blok pertama contoh.m — properti disetel, lalu dibaca kembali sebagai bukti:

matlab
f = figure('visible', 'off', ...
    'Name', 'Dasbor Penjualan Budi', 'NumberTitle', 'off', ...
    'Position', [100 100 900 500], 'Color', [1 1 1]);
fprintf('Name     : %s\n', get(f, 'Name'));
fprintf('Position : %s\n', mat2str(get(f, 'Position')));

Output yang Dihasilkan:

text
Name     : Dasbor Penjualan Budi
Position : [100 100 900 500]

Mekanismenya: pasangan name-value pada figure(...) menulis properti saat pembuatan; get(f, 'Properti') membacanya kembali. Position menentukan ukuran kanvas dasbor — angka yang sama juga dipakai saveas sehingga ukuran berkas ikut terkendali.

Menautkan Sumbu Antar Panel: linkaxes #

Aturannya: dua panel yang membandingkan deret waktu harus di-zoom bersamaan. Mekanismenya: linkaxes([ax1 ax2], 'x') memasang listener pada properti XLim tiap axes — saat satu panel di-zoom, nilai XLim berubah dan listener menyalin batas baru ke panel pasangannya:

matlab
bulan = 1:12;
tunai  = [82 90 85 96 92 105 100 108 104 115 110 122];
kredit = [40 44 42 48 46 53 50 56 54 60 57 66];

ax1 = subplot(1, 2, 1);
plot(bulan, tunai, '-o');
title('Tunai'); xlabel('Bulan'); ylabel('Ribuan');

ax2 = subplot(1, 2, 2);
plot(bulan, kredit, '--s');
title('Kredit'); xlabel('Bulan'); ylabel('Ribuan');

linkaxes([ax1 ax2], 'x');            % kaitkan sumbu-x kedua panel
xlim(ax1, [1 8]);                    % fokuskan panel kiri
fprintf('XLim ax1 (diatur manual) : %s\n', mat2str(get(ax1, 'XLim')));
fprintf('XLim ax2 (ikut sinkron)  : %s\n', mat2str(get(ax2, 'XLim')));

saveas(f, 'interaktif-linkaxes.png');
fprintf('Grafik tersimpan: interaktif-linkaxes.png\n');

Output yang Dihasilkan (lanjutan figur f):

text
XLim ax1 (diatur manual) : [1 8]
XLim ax2 (ikut sinkron)  : [1 8]
Grafik tersimpan: interaktif-linkaxes.png

Mari kita bedah baris-baris kode di atas:

  1. Baris 5 dan 9 (ax1 = subplot(...) / ax2 = subplot(...)): subplot mengembalikan handle axes — linkaxes butuh handle axes, bukan handle figur.
  2. Baris 13 (linkaxes([ax1 ax2], 'x')): hanya sumbu-x yang ditautkan; ganti 'x' dengan 'y' atau 'xy' bila sinkronisasi juga diperlukan pada sumbu-y.
  3. Baris 14 (xlim(ax1, [1 8])): membatasi panel kiri ke bulan 1-8 — di desktop, zoom dengan mouse menghasilkan efek yang persis sama.
  4. Baris 16 (get(ax2, 'XLim')): batas panel kanan ikut berubah menjadi [1 8] tanpa disentuh — bukti tertulis bahwa penautan bekerja, pengganti “melihat” jendela desktop.

MATLAB melangkah lebih jauh dengan linkdata on, yang menautkan grafik ke variabel workspace: mengubah tunai langsung menggambar ulang figur. linkdata hanya tersedia di MATLAB dan bekerja pada desktop — GNU Octave tidak mengimplementasikannya.

Zoom, Pan, dan Data Cursor #

Tiga alat bantu analisis cepat di desktop, semuanya diaktifkan dari toolbar figur atau dari Command Window:

AlatPerintahInteraksi
Zoomzoom onklik memperbesar area di bawah kursor; klik sambil geser memilih kotak
Panpan onseret grafik untuk menggeser rentang tanpa mengubah skala
Rotasi 3Drotate3d onseret figur surf untuk memutar sudut pandang

Perintah zoom off / pan off mengembalikan figur ke mode seleksi biasa. Kedua fungsi hadir di MATLAB dan Octave desktop, tetapi keduanya tidak bermakna pada figur 'visible', 'off' karena tidak ada jendela yang menerima klik.

Alat pembaca nilai paling penting adalah data cursor: datacursormode on (MATLAB) lalu klik titik data menampilkan tooltip berisi koordinatnya. Tooltip bisa dikustomisasi lewat update function yang memformat teks dari titik yang diklik — misalnya menambahkan nama seri atau selisih terhadap target. Fitur ini sepenuhnya milik MATLAB desktop; Octave tidak menyediakan datacursormode.

ginput dan Label Sumbu Terputar #

Kadang kita butuh koordinat dari pengguna, bukan dari data: menandai anomali, memilih dua titik untuk menghitung kemiringan. Fungsi ginput(n) mengumpulkan n klik dari jendela figur:

matlab
% Jalankan di desktop (butuh jendela tampil):
[xKlik, yKlik] = ginput(2);
fprintf('Dua titik dipilih: (%g, %g) dan (%g, %g)\n', ...
        xKlik(1), yKlik(1), xKlik(2), yKlik(2));

Mekanismenya: ginput menunggu klik mouse, mencatat posisi dalam koordinat data, lalu mengembalikannya sebagai vektor — kode berikutnya bisa menghitung apa pun dari titik itu. Tanpa display, ginput menggantung tanpa batas, sehingga potongan ini sengaja tidak dijalankan dalam contoh.m.

Interaksi paling sederhana yang TETAP bisa diuji headless adalah memutar label sumbu-x — solusi klasik untuk nama kategori panjang yang bertabrakan. xtickangle(derajat) (MATLAB R2014b+, tersedia juga di Octave 10) memutar label mengikuti sudut yang diminta:

matlab
g = figure('visible', 'off');
kota = {'Jakarta'; 'Bandung'; 'Surabaya'; 'Medan'; 'Makassar'};
ratarata = [186 152 148 141 133];
bar(1:5, ratarata);
set(gca, 'XTick', 1:5, 'XTickLabel', kota);
xtickangle(45);
title('Rata-rata unit per kota');
fprintf('Rotasi label x: %g derajat\n', get(gca, 'XTickLabelRotation'));

saveas(g, 'interaktif-xtickangle.png');
fprintf('Grafik tersimpan: interaktif-xtickangle.png\n');

Output yang Dihasilkan:

text
Rotasi label x: 45 derajat
Grafik tersimpan: interaktif-xtickangle.png

Mari kita bedah baris-baris kode di atas:

  1. Baris 2 (kota = {...}): lima nama kota tanpa pemotongan — pada posisi default yang mendatar, label sepanjang ini saling bertumpuk di bawah sumbu.
  2. Baris 5 (set(gca, 'XTick', 1:5, 'XTickLabel', kota)): label kategori dipasang sebagai cell array pada ticks 1 sampai 5, pola dari Chapter Axis Limits dan Scales.
  3. Baris 6 (xtickangle(45)): label dimiringkan 45 derajat sehingga tiap nama mendapat ruang diagonal — properti XTickLabelRotation membaca kembali nilai 45 sebagai bukti.

Ringkasan #

Interaktivitas terbagi dua: alat desktop (zoom, pan, data cursor, ginput, linkdata) yang menunggu event dari jendela, dan properti yang bisa diverifikasi dari skrip (Name, Position, XTickLabelRotation) serta linkaxes yang sinkronisasi sumbunya terbukti lewat get. Skrip analisis yang sehat menulis kode interaktif untuk manusia di desktop sekaligus tetap memakai pola figure('visible','off') + fprintf untuk mesin. Grafik yang sudah tuntas diinteraksikan tinggal dibawa pulang: Chapter Export Figures menutup section ini dengan cara menyimpannya ke berkas.