1. 程式人生 > >Matlab三維資料畫圖和等高線資料提取

Matlab三維資料畫圖和等高線資料提取

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');