Plot 3D

Memvisualkan data tiga dimensi dengan plot3, mesh, dan surf.

Daftar isi

Data teknik tidak selalu berupa kurva dua dimensi, karena lintasan bergerak dalam ruang dan permukaan bergantung pada dua variabel bebas. Topik ini membahas kurva ruang dengan plot3, pembentukan grid evaluasi dengan meshgrid, permukaan kisi dengan mesh, dan permukaan berwarna dengan surf beserta colormap, colorbar, dan view. Setelah topik ini, data tiga dimensi dapat divisualkan lengkap dengan label tiga sumbu, skala warna, dan sudut pandang yang dapat diatur.

Kurva ruang dengan plot3#

Panggilan plot3(x, y, z) adalah padanan tiga dimensi dari plot, yakni menempatkan titik (xk,yk,zk)(x_k, y_k, z_k) dalam ruang lalu menghubungkannya dengan garis. Sumbu ketiga membuat kedalaman lintasan terbaca, dan grid on menjadi lebih penting daripada pada figur dua dimensi karena garis bantu membantu mata menempatkan titik pada ruang. Contoh klasiknya adalah heliks, yakni lintasan yang berputar sambil naik, dengan persamaan x=cos⁡(t)x = \cos(t), y=sin⁡(t)y = \sin(t), dan z=t/(2π)z = t/(2\pi).

matlab lintasan-heliks.m
% lintasan-heliks.m: lintasan heliks tiga dimensi dengan plot3
t = linspace(0, 6*pi, 300);
x = cos(t);
y = sin(t);
z = t / (2*pi);
plot3(x, y, z, 'b-');
xlabel('x');
ylabel('y');
zlabel('Putaran');
title('Lintasan heliks tiga putaran');
grid on;
print('-dsvg', 'lintasan-heliks.svg');

Lintasan tiga putaran hasil skrip itu tampak pada figur berikut.

GnuplotProduced by GNUPLOT 6.0 patchlevel 2-1-0.500.51-1-0.500.5100.511.522.53gnuplot_plot_1axyPutaranLintasan heliks tiga putaran
Lintasan heliks tiga putaran dalam ruang tiga dimensi

Perintah dekorasi yang dipakai sama dengan figur dua dimensi, hanya ditambah zlabel untuk sumbu ketiga. Sudut pandang bawaan dipilih agar ketiga sumbu terlihat sekaligus, dan sudut pandang itu dapat diatur sendiri melalui view seperti dibahas pada bagian permukaan berwarna. Kurva ruang dengan gaya garis dan penanda juga mengikuti konvensi triplet yang sama dengan plot, sehingga dua lintasan dapat dibedakan dengan 'b-' dan 'r--'.

Grid evaluasi dengan meshgrid#

Permukaan z=f(x,y)z = f(x, y) tidak dapat digambar dari dua vektor karena nilainya harus tersedia pada setiap kombinasi titik x dan y. Fungsi meshgrid membangun kombinasi itu dengan mengubah dua vektor menjadi dua matriks berukuran sama. Matriks X menyimpan satu nilai x pada tiap kolomnya, dan matriks Y menyimpan satu nilai y pada tiap barisnya. Pasangan (Xij,Yij)(X_{ij}, Y_{ij}) pada posisi sama menyimpan satu titik bidang, sehingga Z yang dihitung dari keduanya berbentuk matriks dengan ukuran yang sama pula.

matlab Bentuk matriks hasil meshgrid
[X, Y] = meshgrid(linspace(-2, 2, 5), linspace(-2, 2, 3));
disp(size(X));
disp(X);
text Keluaran
   3   5
  -2  -1   0   1   2
  -2  -1   0   1   2
  -2  -1   0   1   2

Keluaran di atas memperlihatkan mekanismenya pada skala kecil. Vektor lima nilai x dan tiga nilai y menghasilkan matriks X berukuran tiga kali lima. Setiap baris X berisi nilai x yang sama, sedangkan Y menyusun pola kebalikan, yaitu nilai y yang sama pada setiap kolomnya. Fungsi permukaan lalu dievaluasi sekali untuk seluruh titik dengan operasi per elemen, misalnya exp(-(X.^2 + Y.^2)), dan hasilnya siap digambar oleh mesh maupun surf.

Permukaan kisi dengan mesh#

Fungsi mesh(X, Y, Z) menggambar permukaan sebagai kisi garis, yakni garis mengikuti baris dan kolom matriks di atas bidang (x,y)(x, y), dengan tinggi tiap simpul mengikuti Z. Bentuk kisi memperlihatkan struktur grid evaluasi secara langsung sehingga pembaca melihat dari mana permukaan berasal. Contoh berikut memakai fungsi Gaussian dua dimensi z=e−(x2+y2)z = e^{-(x^2 + y^2)} pada grid tujuh belas kali tujuh belas.

matlab permukaan-mesh.m
% permukaan-mesh.m: permukaan Gaussian sebagai kisi garis dengan mesh
[X, Y] = meshgrid(linspace(-2, 2, 17), linspace(-2, 2, 17));
Z = exp(-(X.^2 + Y.^2));
mesh(X, Y, Z);
xlabel('x');
ylabel('y');
zlabel('z');
title('Permukaan Gaussian dua dimensi sebagai kisi');
print('-dsvg', 'permukaan-mesh.svg');

Permukaan Gaussian sebagai kisi garis hasil skrip itu tampak pada figur berikut.

GnuplotProduced by GNUPLOT 6.0 patchlevel 2gnuplot_plot_1agnuplot_plot_2agnuplot_plot_3agnuplot_plot_4agnuplot_plot_5agnuplot_plot_6agnuplot_plot_7agnuplot_plot_8agnuplot_plot_9agnuplot_plot_10agnuplot_plot_11agnuplot_plot_12agnuplot_plot_13agnuplot_plot_14agnuplot_plot_15agnuplot_plot_16agnuplot_plot_17agnuplot_plot_18agnuplot_plot_19agnuplot_plot_20agnuplot_plot_21agnuplot_plot_22agnuplot_plot_23agnuplot_plot_24agnuplot_plot_25agnuplot_plot_26agnuplot_plot_27agnuplot_plot_28agnuplot_plot_29agnuplot_plot_30agnuplot_plot_31agnuplot_plot_32agnuplot_plot_33agnuplot_plot_34agnuplot_plot_35agnuplot_plot_36a-2-1012x-2-1012y00.20.40.60.81zPermukaan Gaussian dua dimensi sebagai kisi
Permukaan Gaussian dua dimensi sebagai kisi garis

Kerapatan grid menentukan keseimbangan antara kehalusan dan keterbacaan. Grid yang terlalu jarang membuat permukaan tampak bergelombang kasar, sedangkan grid yang terlalu rapat menghasilkan kisi yang pekat dan lambat dirender. Grid sekitar dua puluh titik per sisi sudah memadai untuk permukaan mulus pada figur berukuran biasa, dan jumlah itu dapat naik ketika figur dicetak besar.

Permukaan berwarna dengan surf#

Fungsi surf(X, Y, Z) menggambar permukaan sebagai petak-petak berwarna, dengan warna tiap petak dipetakan dari nilai Z melalui peta warna yang berlaku pada figur. Panggilan colormap(jet) mengganti peta warna tersebut, colorbar menambahkan sumbu skala warna di sisi kanan, dan view(az, el) memutar sudut pandang dengan azimuth dan elevasi dalam derajat. Ketiganya digabung pada contoh berikut.

matlab permukaan-surf.m
% permukaan-surf.m: permukaan Gaussian dengan peta warna, colorbar, dan sudut pandang
[X, Y] = meshgrid(linspace(-2, 2, 21), linspace(-2, 2, 21));
Z = exp(-(X.^2 + Y.^2));
surf(X, Y, Z);
colormap(jet);
colorbar;
view(45, 30);
xlabel('x');
ylabel('y');
zlabel('z');
title('Permukaan Gaussian dengan peta warna jet');
print('-dsvg', 'permukaan-surf.svg');

Permukaan berwarna dengan skala warna di sisi kanan hasil skrip itu tampak pada figur berikut.

GnuplotProduced by GNUPLOT 6.0 patchlevel 2gnuplot_plot_1agnuplot_plot_2agnuplot_plot_3agnuplot_plot_4agnuplot_plot_5agnuplot_plot_6agnuplot_plot_7agnuplot_plot_8agnuplot_plot_9agnuplot_plot_10agnuplot_plot_11agnuplot_plot_12agnuplot_plot_13agnuplot_plot_14agnuplot_plot_15agnuplot_plot_16agnuplot_plot_17agnuplot_plot_18agnuplot_plot_19agnuplot_plot_20agnuplot_plot_21agnuplot_plot_22agnuplot_plot_23agnuplot_plot_24agnuplot_plot_25agnuplot_plot_26agnuplot_plot_27agnuplot_plot_28agnuplot_plot_29agnuplot_plot_30agnuplot_plot_31agnuplot_plot_32agnuplot_plot_33agnuplot_plot_34agnuplot_plot_35agnuplot_plot_36agnuplot_plot_37agnuplot_plot_38agnuplot_plot_39agnuplot_plot_40agnuplot_plot_41agnuplot_plot_42agnuplot_plot_43agnuplot_plot_44a-2-1012x-2-1012y00.20.40.60.81zPermukaan Gaussian dengan peta warna jetgnuplot_plot_1b0.20.40.60.81
Permukaan Gaussian dengan peta warna jet dan colorbar

Warna pada surf membawa informasi yang sama dengan ketinggian, dan kombinasi keduanya memudahkan pembacaan daerah datar dan daerah curam sekaligus. Sudut pandang bawaan sudah layak untuk banyak kasus, tetapi view memberi kendali penuh ketika satu bagian permukaan menutupi bagian lain. Kegunaan colorbar paling terasa ketika pembaca figur perlu mengubah warna menjadi angka, dan pada diagram sebar berwarna perilakunya sama.

Kesalahan umum#

  • Meneruskan vektor pada surf tanpa meshgrid. Permukaan mensyaratkan Z berupa matriks yang barisnya sepanjang y dan kolomnya sepanjang x, sehingga vektor satu dimensi ditolak. Kesalahan ini muncul ketika data x dan y dibuat dengan linspace lalu langsung dipakai tanpa membentuk grid.
matlab surf yang menerima vektor alih-alih matriks
x = linspace(-2, 2, 21);
y = linspace(-2, 2, 21);
z = exp(-(x.^2 + y.^2));
try
  surf(x, y, z);
catch e
  disp(e.message)
end
text Keluaran
surface: rows (Z) must be the same as length (Y) and columns (Z) must be the same as length (X)
  • Memakai X^2 alih-alih X.^2 pada matriks persegi. Kedua bentuk sah secara sintaks ketika X persegi, tetapi X^2 mengalikan matriks menurut aturan aljabar linear sedangkan X.^2 memangkatkan tiap elemen. Hasilnya berupa permukaan yang salah tanpa error apa pun, dan kekeliruan ini paling sering lolos karena grid persegi memang bentuk yang lazim.
  • Menganggap warna dan ketinggian selalu konsisten. Pada surf keduanya diambil dari Z yang sama sehingga konsisten secara bawaan, tetapi setelah warna diganti lewat properti CData, warna dan ketinggian dapat memuat besaran yang berbeda. Pastikan colorbar yang ditampilkan mengacu pada besaran yang benar ketika pemetaan warna diganti.

Ringkasan#

  • Kurva ruang digambar dengan plot3(x, y, z) dan dekorasinya mengikuti konvensi figur dua dimensi ditambah zlabel.
  • meshgrid mengubah dua vektor menjadi pasangan matriks berukuran sama sehingga fungsi dua variabel dievaluasi sekali untuk seluruh titik grid.
  • mesh menggambar permukaan sebagai kisi garis dan surf sebagai petak berwarna, keduanya mensyaratkan Z berupa matriks.
  • colormap mengatur peta warna, colorbar menampilkan skala warnanya, dan view mengatur sudut pandang, dengan peta warna bawaan yang berbeda antar implementasi.

Referensi#