我在处理三个变量的三维图时遇到问题。
我有三个矩阵:温度,湿度和功率。在一年中,每小时对上述各项进行一次测量。因此,对于每个矩阵,我们有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])