Matlab三維資料畫圖和等高線資料提取
阿新 • • 發佈:2019-01-23
1 目的
將4組三維資料,每組資料畫散點圖(fig1),擬合出一個曲面(fig2),並將特定Z值的等高線投影到XY平面(fig3)。
2 主要函式
scatter3( ) 三維散點圖
scatter3(X,Y,Z,S,C)
% 向量 X、Y 和 Z 指定點的位置,都是1維陣列。size(Z) = size(X) * size (Y)
% S 指定點的大小,預設50。也可以是一個和x,y長度一樣的向量,設定不同點大小不同。
% 預設點的形狀是圓形。正方形s,圓形o,上三角形^,菱形d
% C 指定的顏色繪製每個點。可以是字串,RGB或者向量。使用向量可以不同點顏色不同
mesh( ) 三維網格圖
mesh(X,Y,Z,C) % 繪製線框網格 % 如果 X 和 Y 為向量,length(X) = n 且 length(Y) = m,其中 [m,n] = size(Z)。 % 矩陣 C 確定網格顏色,大小與 Z 相同
surf( ) 三維曲面圖
surf(X,Y,Z,C)
% 預設的曲面顏色與 Z 成比例
% 使用 C 將指定曲面顏色
% 由於原始資料點偏少,最好先用griddata()插入更多資料點
contour( ) 等高線圖
[C,h] = contour(X,Y,Z)
% 返回等高線矩陣 C(包含定義等高線的資料)和 Contour 物件 h
% 如只想畫出Z在i處的等高線,則呼叫 [C,h] = contour(X,Y,Z,[i,i])。再呼叫 C 即可獲得該等高線的資料
% h 為等高線物件。可設定粗細、顏色等屬性
cell 陣列
多組資料繪圖,我傾向使用迴圈解決。以上命令的 X,Y 都是矩陣(陣列),matlab裡可以用 cell 陣列 儲存矩陣。
RGB 格式
maltab 的 RGB 不是 [255 255 255] 形式,而是 [1 1 1]。對應 RGB 數值除以255即可。
3 程式碼實現
clear;clc;close all; %% data input data1 = importdata('sta_1'); data2 = importdata('sta_2'); data3 = importdata('sta_3'); data4 = importdata('sta_4'); color = [0.8588 0.2745 0.19216; 0.8941 0.6627 0.1961; 0 0.5412 0.7765; 0.6275 0.2 0.5765]; % 自定義顏色 red, yellow, blue, purple x = cell(4,1);y = cell(4,1);z = cell(4,1); % cell元胞陣列,可以存陣列.目的是利用cell迴圈作圖. % x{i} = data{i}(:,1) % 第i組資料(xyz均為1維資料)分別存入X{i},Y{i},Z{i} for i = 1:4 eval(['x{',num2str(i) '}= data' num2str(i) '(:,1)']); % index 中呼叫變數,需要用到num2str() eval(['y{',num2str(i) '}= data' num2str(i) '(:,2)']); eval(['z{',num2str(i) '}= data' num2str(i) '(:,3)']); end real = [0.610293 0.559696 0.614283 0.63131]; % 需要畫等高線的高度 %% fig.1: sactter dot1 = {'s' 'o' '^' 'd'}; % dot shape figure; daspect([8 5 1]); % 座標軸xyz刻度比例 hold on; grid on; for i = 1:4 scatter3(x{i},y{i},z{i},dot1{i},'MarkerFaceColor',color(i,:),'MarkerEdgeColor',color(i,:)); end view(40,25); xlabel('x');ylabel('y');zlabel('z');;xlim([0 16]);ylim([0 10]); title('xyz'); set(gca,'xTick',[0:2:16],'yTick',[0:2:10],'LineWidth',2,'FontSize',20,'GridLineStyle' ,'--'); legend('1','2','3','4','location','northeast'); hold off; % print('-depsc','-r800','fig1.eps'); %% surface X = cell(4,1);Y = cell(4,1);Z = cell(4,1); Xm = cell(4,1);Ym = cell(4,1);Zm = cell(4,1); figure daspect([8 5 1]); % 座標軸xyz刻度比例 hold on; grid on; for i = 1:4 [X{i},Y{i},Z{i}] = griddata(x{i},y{i},z{i},linspace(-1,17)',linspace(-1,11),'v4'); C = zeros(size(X{i})); C(:,:,1) = color(i,1);C(:,:,2) = color(i,2);C(:,:,3) = color(i,3); surf(X{i},Y{i},Z{i},C); % shading flat; end legend('1','2','3','4','location','northeast'); for i = 1:4 % shading flat; Xm{i} = -1:17;Ym{i} = -1:17;Zm{i} = real(i)*ones(19); Cm = zeros(size(Zm{i})); Cm(:,:,1) = color(i,1);Cm(:,:,2) = color(i,2);Cm(:,:,3) = color(i,3); mesh(Xm{i},Ym{i},Zm{i},Cm); % 新增一張網格平面 end alpha(0.8); % transparency view(40,25); xlabel('x');ylabel('y');zlabel('z');xlim([0 16]);ylim([0 10]); title('xyz'); set(gca,'LineWidth',2,'FontSize',20,'xTick',[0:2:16],'yTick',[0:2:10],'GridLineStyle' ,'--'); hold off; %print('-depsc','-r800','fig2.eps'); %% contour cm = cell(4,1); hm = cell(4,1); figure hold on; for i = 1:4 [cm{i},hm{i}]=contour(X{i},Y{i},Z{i},[real(i),real(i)]); % cm(i)儲存了等高線的資料 set(hm{i},'color',color(i,:),'LineWidth',2); % ,'ShowText','on' end legend('1','2','3','4','location','northeast'); xlabel('x');ylabel('y');xlim([0 16]);ylim([0 10]);title('xyz'); set(gca,'LineWidth',2,'FontSize',20,'xtick',[0:1:16],'ytick',[0:0.5:7]); hold off; % print('-depsc','-r800','fig3.eps');