Cụm xnxn matrix matlab plot xy xuất hiện dày đặc trên mạng nhưng không phải thuật ngữ của MATLAB. Không có kiểu dữ liệu nào tên như vậy, cũng không có hàm nào tên như vậy. Người gõ cụm này gần như luôn đang hỏi một việc có thật: vẽ đồ thị từ một ma trận vuông cỡ n nhân n.
Tóm tắt. Việc thật chia làm ba nhánh. Nếu ma trận của bạn là nhiều dãy số dùng chung một trục x thì dùng plot, và MATLAB vẽ mỗi cột thành một đường. Nếu ma trận là một bảng giá trị hai chiều thì plot cho ra một mớ đường vô nghĩa, phải dùng surf, mesh, contour hoặc imagesc. Riêng ma trận vuông có một cái bẫy mà tài liệu MathWorks ghi hẳn thành một câu: khi bạn đưa vào một vectơ và một ma trận vuông, MATLAB không đoán được ý bạn nên luôn vẽ theo cột.
Xnxn matrix matlab plot xy không phải lệnh nào của MATLAB
Nói thẳng để bạn khỏi mất thời gian tra tiếp. Trong tài liệu chính thức của MathWorks không có mục nào tên như vậy. Chữ này lan trên mạng như một cụm rỗng gắn kèm tên MATLAB, và các trang đang xếp hạng cho nó đều tự đặt ra một định nghĩa rồi viết tiếp.
Khái niệm gần nhất có thật là ma trận vuông, tức ma trận có số hàng bằng số cột. Trong MATLAB, một biến như vậy chỉ là mảng hai chiều bình thường. Không có gì đặc biệt về mặt kiểu dữ liệu.
Nhưng ma trận vuông lại đặc biệt đúng ở chỗ vẽ đồ thị, vì lúc đó MATLAB mất khả năng đoán bạn muốn hàng hay cột. Phần dưới nói kỹ chỗ đó. Nếu bạn tới đây từ câu hỏi tiếng Anh how to plot in matlab thì cứ đọc tiếp, vì đó là cùng một việc.
Nền tảng: plot với hai vectơ
Trước khi bàn tới ma trận, cần chắc tay với dạng đơn giản nhất. Bạn tạo một vectơ cho trục x, tính vectơ tương ứng cho trục y, rồi gọi plot.
Ví dụ 1. Vẽ đồ thị hàm sin.
x = 0:0.1:10;
y = sin(x);
plot(x, y)
xlabel('x'), ylabel('sin(x)')
title('y = sin(x)'), grid on
Dấu hai chấm ở dòng đầu tạo vectơ chạy từ 0 tới 10 với bước 0,1. Muốn đúng số điểm thì dùng linspace(0, 10, 101) thay cho dấu hai chấm.
Nếu bạn chỉ gọi plot(y) với một vectơ, MATLAB tự lấy trục x chạy từ 1 tới độ dài của y. Đó là lý do nhiều người thấy trục hoành ra số thứ tự chứ không ra giá trị mình mong.
Đưa cả ma trận vào plot thì mỗi cột thành một đường
Đây là quy tắc nền của mọi câu hỏi về vẽ ma trận. Tài liệu MathWorks viết rằng khi Y là ma trận thì đồ thị có một đường cho mỗi cột của Y, và toạ độ x chạy từ 1 tới số hàng của Y.
Hình 1. Số đường bằng số cột, số điểm trên mỗi đường bằng số hàng. Nhớ ngược lại là nguồn của phần lớn lỗi.
Ví dụ 2. Ma trận bốn hàng ba cột.
A = [1 2 3; 4 5 6; 7 8 9; 10 11 12];
plot(A)
Kết quả là ba đường, mỗi đường có bốn điểm, trục x chạy 1, 2, 3, 4.
Muốn ngược lại, mỗi hàng thành một đường, thì chuyển vị: plot(A')
Khi bạn đưa cả hai đối số, quy tắc mở rộng như sau. Nếu độ dài vectơ bằng số hàng của ma trận thì MATLAB vẽ từng cột theo vectơ đó. Nếu độ dài vectơ bằng số cột thì MATLAB vẽ từng hàng. Còn nếu cả X và Y đều là ma trận cùng cỡ thì MATLAB vẽ từng cột của Y theo cột tương ứng của X.
Bẫy riêng của ma trận vuông
Đây là chỗ mà cụm tìm kiếm ban đầu vô tình chỉ đúng vào một vấn đề thật. Với ma trận vuông, độ dài vectơ khớp cả hai chiều cùng lúc, nên quy tắc trên tự mâu thuẫn.
MathWorks giải quyết bằng một câu dứt khoát trong tài liệu: nếu ma trận là ma trận vuông thì hàm vẽ từng cột theo vectơ. Hàm plot không có tham số nào đảo lại quy ước đó.
Hệ quả rất thực tế. Nếu dữ liệu của bạn xếp theo hàng, mỗi hàng là một phép đo, và ma trận tình cờ vuông, thì plot(x, A) sẽ vẽ sai mà không báo lỗi gì. Bạn nhận đủ n đường, trông có vẻ hợp lý, nhưng đó là các cột. Cách sửa duy nhất là chuyển vị: plot(x, A').
Với ma trận không vuông thì lỗi này lộ ra ngay, vì chỉ có một chiều khớp được với vectơ. Ma trận vuông là trường hợp duy nhất chương trình chạy trót lọt nhưng kết quả không phải cái bạn muốn.
Khi nào đừng dùng plot nữa
Phần lớn người tìm xnxn matrix matlab plot xy thực ra không có nhiều dãy số. Họ có một bảng giá trị hai chiều, kiểu độ cao theo toạ độ, nhiệt độ theo lưới, hay ma trận tương quan. Với dữ liệu đó, plot cho ra n đường chồng lên nhau và không nói lên điều gì.
Hình 2. Bốn ý nghĩa dữ liệu và hàm tương ứng. Chọn sai nhánh thì đồ thị vẫn hiện ra, chỉ là không đọc được gì.
Hàm heatmap nhận thẳng một ma trận hai chiều, không cần bảng dữ liệu. Nhãn mặc định trên hai trục là 1, 2, 3 và tiếp tục như vậy. Hàm imagesc thì vẽ mỗi phần tử thành một ô màu, tạo ra lưới ảnh cỡ m nhân n đúng bằng cỡ ma trận.
Hàng là trục y, cột là trục x
Chỗ này gây nhầm nhiều hơn cả cú pháp. Trong ma trận, bạn quen viết chỉ số hàng trước. Trên đồ thị thì trục x lại đi với chỉ số cột.
Hình 3. Quy ước này áp cho surf, mesh và contour. Riêng imagesc còn đảo chiều trục y so với hệ toạ độ quen thuộc.
Tài liệu của surf ghi rằng hàm dùng chỉ số cột và chỉ số hàng của các phần tử trong Z làm toạ độ x và y. Khi bạn tự truyền toạ độ bằng hai vectơ, X phải có số phần tử bằng số cột của Z, còn Y bằng số hàng của Z. Đưa nhầm thứ tự là báo lỗi kích thước ngay.
Hàm imagesc còn một đặc điểm nữa. Nó đặt thuộc tính YDir thành reverse, nghĩa là giá trị trên trục y tăng dần từ trên xuống dưới. Hàng đầu của ma trận hiện ở trên cùng, đúng như khi bạn nhìn ma trận trong cửa sổ lệnh, nhưng ngược với hệ toạ độ Đề-các quen thuộc.
Đặt lại YDir thành normal thì trục y quay về chiều quen thuộc, nhưng ảnh cũng bị lật theo, tức hàng đầu của ma trận rơi xuống dưới cùng. Hãy cân nhắc trước khi đổi, vì phần lớn trường hợp nhìn theo chiều mặc định lại dễ đối chiếu với ma trận hơn.
meshgrid: kích thước hay bị nhầm
Muốn vẽ mặt cong của một hàm hai biến, bạn cần lưới toạ độ. Hàm meshgrid làm việc đó, và cỡ lưới nó trả về là chỗ hay nhầm nhất.
Ví dụ 3. Mặt cong từ lưới vuông.
x = linspace(-2, 2, 41);
[X, Y] = meshgrid(x, x);
Z = X.^2 - Y.^2;
surf(X, Y, Z), colorbar
Tài liệu ghi rõ rằng lưới biểu diễn bởi X và Y có length(y) hàng và length(x) cột. Thứ tự này ngược với trực giác của nhiều người, vì tên biến x đứng trước nhưng lại quyết định số cột.
Gọi meshgrid(x) với một đối số thì tương đương meshgrid(x, x), trả về lưới vuông cỡ length(x) nhân length(x). Đó chính là trường hợp ma trận vuông mà bài này bàn từ đầu.
Còn ndgrid tạo lưới theo quy ước khác: hai chiều đầu bị hoán đổi so với meshgrid. Đừng trộn hai hàm này trong cùng một đoạn mã.
Đặt tên trục, chú thích và nhiều đồ thị một khung
Phần này trả lời gọn câu hỏi how to plot in matlab ở mức căn bản. Sau khi có hình, bạn dùng title, xlabel và ylabel để đặt tên, grid on để bật lưới, và legend để chú thích từng đường.
Muốn vẽ chồng nhiều đồ thị lên một trục thì gọi hold on trước các lệnh vẽ sau, và hold off khi xong. Muốn chia khung thành nhiều ô riêng thì dùng subplot(m, n, k), trong đó k là ô đang vẽ.
Kiểu đường và màu đặt bằng chuỗi ngắn ngay sau dữ liệu, ví dụ plot(x, y, 'r--') cho đường nét đứt màu đỏ. Độ dày đặt bằng cặp tên và giá trị, ví dụ plot(x, y, 'LineWidth', 2).
Lỗi thường gặp
| Hiện tượng | Nguyên nhân | Cách sửa |
|---|---|---|
| plot(A) ra n đường không hiểu gì | A là bảng giá trị hai chiều, không phải nhiều dãy số | Chuyển sang imagesc, surf hoặc contour |
| Muốn vẽ theo hàng nhưng ra theo cột | A vuông nên MATLAB mặc định hiểu là cột | Chuyển vị: plot(x, A') |
| Hình lộn ngược so với ma trận | imagesc đặt YDir thành reverse | Đặt YDir thành normal, nhưng ảnh cũng lật theo |
| surf báo lỗi kích thước | X phải dài bằng số cột, Y dài bằng số hàng của Z | Đổi chỗ hai vectơ, hoặc tạo lưới bằng meshgrid |
| Lưới meshgrid ra sai chiều | Lưới có length(y) hàng và length(x) cột | Đọc lại thứ tự, hoặc chuyển sang ndgrid |
| Đồ thị lạ khi dữ liệu là số phức | plot(Y) vẽ phần ảo theo phần thực của Y | Dùng real(Y), abs(Y) hoặc truyền đủ cả X và Y |
Câu hỏi thường gặp
Xnxn matrix matlab plot xy có phải một hàm của MATLAB không?
Không. Không có hàm nào, kiểu dữ liệu nào hay hộp công cụ nào mang tên đó. Nếu một trang viết như thể đó là lệnh có thật thì trang đó đang bịa. Cụm gần nhất có nghĩa là ma trận vuông cỡ n nhân n.
Làm sao vẽ mỗi hàng của ma trận thành một đường?
Chuyển vị trước khi vẽ, tức plot(A') hoặc plot(x, A'). Đây là cách duy nhất chắc chắn đúng với ma trận vuông, vì với ma trận vuông MATLAB luôn hiểu theo cột.
plot và imagesc khác nhau ở chỗ nào?
Hàm plot coi mỗi cột là một dãy số theo thời gian hoặc theo một biến, rồi nối các điểm thành đường. Hàm imagesc coi mỗi phần tử là một ô và chỉ thể hiện độ lớn bằng màu. Chọn theo ý nghĩa dữ liệu, không theo cỡ ma trận.
How to plot in matlab thì bắt đầu từ đâu?
Bắt đầu bằng hai vectơ cùng độ dài và một lệnh plot(x, y). Nắm chắc phần đó rồi mới sang ma trận. Khi đã sang ma trận, câu hỏi đầu tiên luôn là dữ liệu của bạn có phải nhiều dãy số dùng chung trục x hay không, vì câu trả lời quyết định toàn bộ phần còn lại.