Description
給定所有三維的離散坐標(xi, yi, zi)的數據集,如國賽2011年A題附件1 [1] ,請繪制出三維圖
思路
因為給定的是離散點求解三維地勢圖,如果只用 plot3() 的話只能得到三維曲線,並不能擬合成曲面圖,所以需要先插值再曲面擬合。
對於插值方面,interp2() 只能處理網格型數據。所以對於離散點數據,我選擇的插值方法是 griddata(x, y, z, XI, YI),其中XI,YI是期望的插值位置,與[XI, YI] = meshgrid(XI, YI) 效果相同。
griddata 的語法為 [...] = griddata(..., method),method指定的是插值使用的算法,其值可以是以下幾種類型:(1)nearest:線性最近項插值 (2)linear:線性插值(默認) (3)cubic:雙三次插值 (4)v4:MATLAB 4.0 版本中提供的插值算法
得到了插值點集合,繪制曲面圖的話可以用 mesh()、surf(),前者得到的是網格划分的三維曲面圖,后者得到的是平滑着色的三維曲面圖。在這里我選擇surf(),用mesh()也是可以的。
之后是繪制等高線、城區分類與圖例。
難點是在繪制圖例,我采用的辦法是使用函數 legend() 。首先利用 plot() 繪制五個線條並返回創建的圖線條對象。然后,legend()通過將第一個輸入參數指定為要包含的圖線條對象的向量,創建一個只包括其中兩個線條的圖例。更多圖例方法請參考 [2] 。
以國賽2011年A題附件1 [1] 為例,matlab腳本代碼如下:
clear all,clc; data = load('data1.txt'); x = data(:, 1); y = data(:, 2); z = data(:, 3); d = data(:, 4); [X,Y,Z] = griddata(x,y,z,linspace(min(x),max(x))',linspace(min(y),max(y)),'v4'); %插值 subplot(1,2,1); surfc(X,Y,Z); %三維曲面 xlabel('X'); ylabel('Y'); zlabel('海拔/m'); title('地勢圖') axis tight N = 15; subplot(1,2,2); [c, h] = contour(X, Y, Z, [0:30:308]); clabel(c, h); xlabel('X'); ylabel('Y'); hold on for i = 1:1:length(x) switch d(i) case 1 p1 = plot(x(i), y(i), 'ro'); case 2 p2 = plot(x(i), y(i), 'khexagram'); case 3 p3 = plot(x(i), y(i), 'g^'); case 4 p4 = plot(x(i), y(i), 'y*'); case 5 p5 = plot(x(i), y(i), 'gx'); end end legend([p1, p2, p3, p4, p5], '生活區', '工業區', '山區', '交通區', '公園綠地區', 'Location', 'northeastoutside'); hold off title('等高線以及城區分類')
效果如下:
國賽2011年A題附件1插值擬合出來的三維地勢圖
國賽2011年A題附件1的等高線以及城市分區
參考
[1]:國賽2011年A題下載網址:http://www.matlabsky.com/thread-19740-1-1.html
[2]:利用 legend() 添加圖例:https://ww2.mathworks.cn/help/matlab/ref/legend.html#bt6ef_q-2_1