2011-07-20 43 views
3

對於三個變量的三維圖我有個問題。在三維圖中表示三個變量

我有三個矩陣:溫度,溼度和功率。在一年內,在每個小時,上述每一項都被測量。所以,我們有每個矩陣365 * 24 = 8760點。然後,每天取一個平均點。所以,

Tavg = 365 X 1 
Havg = 365 X 1 
Pavg = 365 X 1 

在veiw電氣點,功率取決於溫度和溼度。我想用三維圖來發現這種關係。

我嘗試在MATLAB中使用mesh,meshz,surf,plot3和許多其他命令,但不幸的是我無法得到我想要的。例如,讓我們先拿10天。在這裏,每天都有平均氣溫,平均溼度和平均功率。

Tavg = [18.6275 
    17.7386 
    15.4330 
    15.4404 
    16.4487 
    17.4735 
    19.4582 
    20.6670 
    19.8246 
    16.4810]; 

Havg = [75.7105 
    65.0892 
    40.7025 
    45.5119 
    47.9225 
    62.8814 
    48.1127 
    62.1248 
    73.0119 
    60.4168]; 

Pavg = [13.0921 
    13.7083 
    13.4703 
    13.7500 
    13.7023 
    10.6311 
    13.5000 
    12.6250 
    13.7083 
    12.9286]; 

如何用三維圖表示這些矩陣?

+0

我認爲plot3應該可以工作。 –

+0

我嘗試過使用plot3,但我希望它處於表面或平面的形狀。比如這個形狀,例如:http://store2.up-00.com/Jun11/tVv30947.jpg我認爲這是使用網格,但我不知道如何。 – user488182

回答

0

我認爲你要求一個表面適合你的數據。曲線擬合工具箱處理這個問題很好:

% Fit model to data. 
ft = fittype('poly11'); 
fitresult = fit([Tavg, Havg], Pavg, ft); 

% Plot fit with data. 
plot(fitresult, [xData, yData], zData); 
legend('fit 1', 'Pavg vs. Tavg, Havg', 'Location', 'NorthEast'); 
xlabel('Tavg'); 
ylabel('Havg'); 
zlabel('Pavg'); 
grid on 

如果你沒有曲線擬合工具箱,你可以使用反斜線操作:

% Find the coefficients. 
const = ones(size(Tavg)); 
coeff = [Tavg Havg const] \ Pavg; 

% Plot the original data points 
clf 
plot3(Tavg,Havg,Pavg,'r.','MarkerSize',20); 
hold on 

% Plot the surface. 
[xx, yy] = meshgrid(... 
    linspace(min(Tavg),max(Tavg)) , ... 
    linspace(min(Havg),max(Havg))); 
zz = coeff(1) * xx + coeff(2) * yy + coeff(3); 
surf(xx,yy,zz) 
title(sprintf('z=(%f)*x+(%f)*y+(%f)',coeff)) 
grid on 
axis tight 

這兩種適合的線性多項式表面,即一架飛機,但你可能想要使用更復雜的東西。這兩種技術都可以適應這種情況。在mathworks.com上有關於此主題的更多信息:How can I determine the equation of the best-fit line, plane, or N-D surface using MATLAB?

1

挑戰在於三維表面繪圖函數(網格,衝浪等)正在尋找z值的二維矩陣。所以要使用它們,你需要從數據中構建這樣一個矩陣。

當前數據是三維空間中點的海,所以您必須將這些點映射到曲面。一個簡單的方法是將X-Y(溫度 - 溼度)平面分成多個分箱,然後取所有Z(功率)數據的平均值。下面是一些使用accumarray()計算每個bin的平均值的示例代碼: %指定bin的大小 Tbin = 3; Hbin = 20;

% Create binned average array 
% First create a two column array of bin indexes to use as subscripts 
subs = [round(Havg/Hbin)+1, round(Tavg/Tbin)+1]; 

% Now create the Z (power) estimate as the average value in each bin 
Pest = accumarray(subs,Pavg,[],@mean); 

% And the corresponding X (temp) & Y (humidity) vectors 
Tval = Tbin/2:Tbin:size(Pest,2)*Tbin; 
Hval = Hbin/2:Hbin:size(Pest,1)*Hbin; 

% And create the plot 
figure(1) 
surf(Tval, Hval, Pest) 
xlabel('Temperature') 
ylabel('Humidity') 
zlabel('Power') 
title('Simple binned average') 

xlim([14 24]) 
ylim([40 80]) 

圖形有點粗(不能張貼照片呢,因爲我是新的),因爲我們只有幾個數據點。我們可以通過將其值設置爲NaN來刪除任何空箱來增強可視化。此外,裝箱方法隱藏了Z(功率)數據的任何變化,因此我們也可以使用plot3覆蓋單位點雲,而不繪製連接線。 (再一次B/C我是新無圖像)

的最後情節附加代碼: %%展開情節

% Remove zeros (useful with enough valid data) 
%Pest(Pest == 0) = NaN; 

% First the original points 
figure(2) 
plot3(Tavg, Havg, Pavg, '.') 

hold on 
% And now our estimate 
% The use of 'FaceColor' 'Interp' uses colors that "bleed" down the face 
% rather than only coloring the faces away from the origin 
surfc(Tval, Hval, Pest, 'FaceColor', 'Interp') 

% Make this plot semi-transparent to see the original dots anb back side 
alpha(0.5) 

xlabel('Temperature') 
ylabel('Humidity') 
zlabel('Power') 
grid on 

title('Nicer binned average') 
xlim([14 24]) 
ylim([40 80]) 
0

你可能想看看德勞內三角:

tri = delaunay(Tavg, Havg); 
trisurf(tri, Tavg, Havg, Pavg); 

使用您的示例數據,此代碼會生成一個有趣的「表面」。但我相信這是做你想做的另一種方式。

0

您也可以嘗試MATLAB Central的John D'Errico的GridFit工具。這個工具產生的表面類似於數據點之間的插值(如MATLAB的griddata所做的那樣),但是結果更加清晰,因爲它可以平滑所得到的曲面。從概念上講,對於附近或重疊的X,Y座標的多個數據點進行平均,以產生平滑的結果而不是嘈雜的「漣漪」。該工具還允許在數據點之外進行一些外推。這裏是(已安裝假設GridFit工具)一個代碼示例:

%Establish points for surface 
num_points = 20; 
Tval = linspace(min(Tavg),max(Tavg),num_points); 
Hval = linspace(min(Havg),max(Havg),num_points); 

%Do the fancy fitting with smoothing 
Pest = gridfit(Tavg, Havg, Pavg, Tval, Hval); 

%Plot results 
figure(5) 
surfc(XI,YI,Pest, 'FaceColor', 'Interp') 

要產生一個更漂亮的情節,你可以添加標籤,一些transparancy和覆蓋原來的點:

alpha(0.5) 
hold on 
plot3(Tavg,Havg,Pavg,'.') 

xlabel('Temperature') 
ylabel('Humidity') 
zlabel('Power') 
grid on 

title('GridFit') 

PS:@upperBound:感謝Delaunay三角尖。這似乎是要走的路,如果你想通過每一個點。我是新手,所以無法評論。

0

下面是你的解決方案:

  1. 保存/寫Myplot3D功能

    function [x,y,V]=Myplot3D(X,Y,Z) 
    x=linspace(X(1),X(end),100); 
    y=linspace(Y(1),Y(end),100); 
    [Xt,Yt]=meshgrid(x,y); 
    V=griddata(X,Y,Z,Xt,Yt); 
    
  2. 呼叫從自己的命令行(或腳本)

    [Tavg_new,Pavg_new,V]=Myplot3D(Tavg,Pavg,Havg); 
    surf(Tavg_new,Pavg_new,V) 
    colormap jet; 
    xlabel('Temperature') 
    ylabel('Power/Pressure') 
    zlabel('Humidity') 
    
以下

surface from 3 vectors