我在处理三个变量的三维图时遇到问题。

我有三个矩阵:温度,湿度和功率。在一年中,每小时对上述各项进行一次测量。因此,对于每个矩阵,我们有365 * 24 = 8760点。然后,每天取一个平均点。所以,

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


在电动角度上,功率取决于温度和湿度。我想使用三维图来发现这种关系。

我尝试在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];


如何用三维图表示这些矩阵?

最佳答案

面临的挑战是3-D表面绘图功能(网格,冲浪等)正在寻找z值的2-D矩阵。因此,要使用它们,您需要根据数据构建这样的矩阵。

当前,数据是3-D空间中大量的点,因此,您必须将这些点映射到曲面。一种简单的方法是将X-Y(温度-湿度)平面划分为bin,然后取所有Z(功率)数据的平均值。这是一些示例代码,它使用accumarray()计算每个bin的平均值:
%指定纸槽尺寸
Tbin = 3;
哈宾= 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])

09-15 14:24