Plot ganda

Menampilkan beberapa kurva dengan hold on, subplot, dan tiledlayout.

Daftar isi

Banyak analisis membandingkan beberapa kurva sekaligus, baik pada satu sumbu yang sama maupun pada panel yang berdampingan. Topik ini membahas penumpukan kurva dengan hold on dan hold off, pembuatan kisi panel dengan subplot, serta bentuk modern tiledlayout dan nexttile pada MATLAB. Setelah topik ini, satu figur dapat memuat beberapa kurva dengan satuan yang sama, atau beberapa panel dengan satuan dan skala yang berbeda, tanpa kehilangan keterbacaan.

Perintah plot pada keadaan bawaan mengosongkan sumbu aktif sebelum menggambar, sehingga panggilan plot kedua menghapus kurva pertama. Perintah hold on mengubah keadaan itu menjadi mode tambah, yakni kurva baru digambar di atas kurva lama tanpa menghapusnya. Perintah hold off mengembalikan perilaku bawaan sehingga panggilan plot berikutnya kembali mengosongkan sumbu. Skrip berikut menumpuk dua kurva suhu pada satu sumbu.

matlab dua-kurva.m
% dua-kurva.m: menumpuk dua kurva dengan hold on dan hold off
jam = 0:0.5:12;
suhuDalam = 24 + 4*sin(jam/2);
suhuLuar = 20 + 6*sin(jam/2 - 1);
plot(jam, suhuDalam, 'b-');
hold on;
plot(jam, suhuLuar, 'r--');
hold off;
title('Suhu dalam dan luar gedung');
xlabel('Jam ke-');
ylabel('Suhu (derajat Celsius)');
legend('Dalam gedung', 'Luar gedung', 'location', 'southeast');
grid on;
print('-dsvg', 'dua-kurva.svg');

Dua kurva yang terpisah dengan jelas hasil skrip itu tampak pada figur berikut.

GnuplotProduced by GNUPLOT 6.0 patchlevel 21416182022242628024681012Dalam gedungDalam gedungLuar gedungLuar gedungSuhu (derajat Celsius)Jam ke-Suhu dalam dan luar gedung
Dua kurva suhu yang ditumpuk dengan hold on

Penumpukan layak dipakai ketika kurva memuat besaran yang sama dengan satuan yang sama, sehingga satu pasang sumbu dan satu skala menampung semuanya. Batas sumbu otomatis diperluas agar seluruh kurva tampak, dan legenda menjadi wajib agar tiap kurva teridentifikasi tanpa menebak. Sebaliknya, dua besaran dengan satuan berbeda tidak boleh dipaksakan berbagi sumbu vertikal karena pembacaan nilai menjadi keliru, dan kebutuhan semacam itu dilayani oleh kisi panel pada bagian berikutnya.

Kisi panel dengan subplot#

Perintah subplot(m, n, k) membagi figur menjadi kisi m baris kali n kolom lalu memilih petak ke-k sebagai sumbu aktif. Nomor petak dihitung berurutan dari kiri ke kanan dan dari atas ke bawah. Pada kisi dua baris satu kolom, petak 1 adalah panel atas dan petak 2 adalah panel bawah. Setelah subplot dipanggil, seluruh perintah gambar dan dekorasi mengenai panel aktif itu sampai petak lain dipilih. Skrip berikut menumpuk dua panel untuk dua besaran dengan satuan berbeda.

matlab subplot-baris.m
% subplot-baris.m: dua panel bertumpuk dengan subplot(2,1,k)
jam = 0:0.5:12;
suhu = 24 + 4*sin(jam/2);
kelembapan = 55 - 10*cos(jam/2);
subplot(2, 1, 1);
plot(jam, suhu, 'b-');
title('Suhu ruang server');
ylabel('Suhu (derajat Celsius)');
grid on;
subplot(2, 1, 2);
plot(jam, kelembapan, 'r-');
title('Kelembapan ruang server');
xlabel('Jam ke-');
ylabel('Kelembapan (%)');
grid on;
print('-dsvg', 'subplot-baris.svg');

Kisi dua baris hasil skrip itu tampak pada figur berikut.

GnuplotProduced by GNUPLOT 6.0 patchlevel 22022242628024681012gnuplot_plot_1aSuhu (derajat Celsius)Suhu ruang server4550556065024681012gnuplot_plot_1bKelembapan (%)Jam ke-Kelembapan ruang server
Panel suhu dan kelembapan yang bertumpuk dalam satu figur

Kisi satu baris dua kolom dipakai ketika perbandingan paling mudah dilakukan dengan mata menyapu ke samping. Skrip berikut menempatkan suhu dua ruangan berdampingan dengan skala yang sama sehingga puncak dan lembah keduanya dapat dibandingkan langsung.

matlab subplot-kolom.m
% subplot-kolom.m: dua panel berdampingan dengan subplot(1,2,k)
hari = 1:7;
ruangA = [24 25 26 26 25 24 23];
ruangB = [22 22 23 24 23 22 21];
subplot(1, 2, 1);
plot(hari, ruangA, 'b-o');
title('Ruang A');
xlabel('Hari ke-');
ylabel('Suhu (derajat Celsius)');
grid on;
subplot(1, 2, 2);
plot(hari, ruangB, 'r--s');
title('Ruang B');
xlabel('Hari ke-');
ylabel('Suhu (derajat Celsius)');
grid on;
print('-dsvg', 'subplot-kolom.svg');

Kedua panel berdampingan hasil skrip itu tampak sebagai berikut.

GnuplotProduced by GNUPLOT 6.0 patchlevel 22323.52424.52525.5261234567gnuplot_plot_1aSuhu (derajat Celsius)Hari ke-Ruang A2121.52222.52323.5241234567gnuplot_plot_1bSuhu (derajat Celsius)Hari ke-Ruang B
Suhu dua ruangan pada dua panel berdampingan

Pada panel sempit seperti contoh terakhir, label yang panjang dan judul yang besar saling berebut ruang. Label vertikal cukup dipasang pada satu panel ketika kedua panel memuat besaran yang sama, dan ukuran huruf dapat diturunkan melalui set(gca, 'FontSize', 10) agar semua teks tetap muat. Keputusan penataan seperti ini menentukan apakah kisi membantu perbandingan atau sekadar memenuhi figur.

tiledlayout pada MATLAB modern#

Mulai R2019b, MATLAB menyediakan tiledlayout dan nexttile sebagai pengganti subplot yang lebih ringkas. Satu panggilan tiledlayout(m, n) menyiapkan seluruh kisi beserta pengaturan jaraknya, lalu setiap nexttile membuka petak berikutnya secara berurutan tanpa perlu menghitung indeks. Argumen 'TileSpacing' dan 'Padding' mengatur jarak antar petak dan tepi figur, misalnya nilai 'compact' yang merapatkan kisi sehingga panel besar lebih memanfaatkan bidang figur. Bentuk itu ditampilkan tanpa dieksekusi karena fungsi ini belum tersedia pada GNU Octave 9.4 yang dipakai untuk memverifikasi contoh pada jalur ini.

matlab MATLAB: kisi dua panel dengan tiledlayout
% tidak-dijalankan
% Padanan MATLAB modern untuk kisi panel: tiledlayout dan nexttile
t = linspace(0, 2*pi, 200);
tiledlayout(2, 1, 'TileSpacing', 'compact', 'Padding', 'compact');
nexttile;
plot(t, sin(t), 'b-');
title('Sinus');
nexttile;
plot(t, cos(t), 'r--');
title('Kosinus');

Hasil visual tiledlayout setara dengan subplot, dan keduanya kerap tampil berdampingan pada kode lama maupun baru. Pembaca yang bekerja pada MATLAB modern disarankan memakai tiledlayout karena pengaturan jarak tidak dimiliki subplot. Pembaca yang membutuhkan kode yang berjalan di kedua implementasi tetap memakai subplot, sebagaimana dua contoh sebelumnya. Perbedaan kedua fungsi itu ada pada kenyamanan pengaturan, bukan pada kemampuan menggambar.

Kesalahan umum#

  • Lupa hold on sehingga kurva sebelumnya terhapus. Panggilan plot kedua pada keadaan bawaan mengosongkan sumbu, dan tidak ada pesan error yang memberi tahu hal itu. Jumlah objek garis pada sumbu dapat diperiksa untuk membuktikan perilakunya.
matlab Jumlah kurva tanpa dan dengan hold on
x = linspace(0, 2*pi, 40);
plot(x, sin(x), 'b-');
plot(x, cos(x), 'r--');
fprintf('jumlah kurva tanpa hold on: %d\n', numel(get(gca, 'Children')));
plot(x, sin(x), 'b-');
hold on;
plot(x, cos(x), 'r--');
hold off;
fprintf('jumlah kurva dengan hold on: %d\n', numel(get(gca, 'Children')));
text Keluaran
jumlah kurva tanpa hold on: 1
jumlah kurva dengan hold on: 2
  • Indeks petak melebihi jumlah petak. Kisi m baris kali n kolom hanya memiliki m×nm \times n petak, dan subplot menolak indeks di luar rentang itu. Kesalahan muncul ketika kisi diubah, misalnya dari tiga baris menjadi dua baris, sementara nomor petak pada kode tidak ikut disesuaikan.
matlab Indeks petak di luar rentang kisi
try
  subplot(2, 1, 3);
catch e
  disp(e.message)
end
text Keluaran
subplot: INDEX value must be >= 1 and <= ROWS*COLS
  • Dekorasi mengenai petak yang salah. Seluruh perintah dekorasi bekerja pada petak aktif terakhir, sehingga title yang ditulis setelah subplot(2, 1, 2) muncul pada panel bawah, bukan panel atas. Kebiasakan pencegahannya adalah menutup tiap petak dengan dekorasinya sendiri sebelum berpindah ke petak berikutnya.

Ringkasan#

  • hold on mengubah sumbu ke mode tambah sehingga kurva baru tidak menghapus kurva lama, dan hold off mengembalikan perilaku bawaan.
  • Penumpukan kurva layak dipakai untuk besaran bersatuan sama, sedangkan kisi panel dipakai untuk besaran atau skala yang berbeda.
  • subplot(m, n, k) memilih petak ke-k yang dihitung dari kiri ke kanan lalu atas ke bawah, dan seluruh perintah gambar serta dekorasi mengenai petak aktif.
  • tiledlayout dan nexttile menggantikan subplot pada MATLAB R2019b ke atas dengan pengaturan jarak yang lebih rapi, tetapi belum tersedia pada GNU Octave.

Referensi#