【问题标题】:How to plot a 3D plot in MATLAB?如何在 MATLAB 中绘制 3D 图?
【发布时间】:2009-11-27 17:30:14
【问题描述】:

我有三个参数xyt。但问题是我的文件结构。

我的文件被命名为:

e_x_y.txt
t_x_y.txt

其中e_x_y.txtxy 的特定值有错误,t_x_y.txt 有相应的时间值。

我需要在x vs y vs t 图表上绘制e_x_y.txt 中的值。

最好的方法是什么?

我知道 x 和 y 值是什么,所以我不必从文件名中扣除它们。


为了让事情更清楚,

假设我的文件是:

e_4_5.txt
45
54
t_4_5.txt
2.0
6.0

e_7_8.txt
32
98
121
t_7_8.txt
2
9
1.0

我想绘制以下几点:

(4,5,2.0) = 45
(4,5,6.0) = 54
(7,8,2.0) = 32 
(7,8,9.0) = 98
(7,8,1.0) = 121

【问题讨论】:

  • 一些澄清:这些变量代表什么?您是否在不同时间测量某物的位置(带有误差估计)?或者xyt可以用2个变量的函数来表示,比如y = f(x,t)
  • 实际上我在我的神经网络的不同配置中使用了一种算法。 e 是错误,t 值是相应的时间。
  • 这些 3D 点是密集分布还是仅针对少数几个值?
  • 这些是示例中的一些不连续点。只是我有数百对这样的文件。这些是来自实际文件的值。

标签: matlab 3d plot


【解决方案1】:

您尝试制作的情节类型可能难以很好地形象化。我可以给你两个建议:一个是你想要的,一个是你应该做的......

绘制 4-D 数据:

为此,您必须绘制一系列x,y,t 点,并以某种方式表示每个点的错误值e。您可以通过更改点的颜色或大小来做到这一点。在此示例中,我将在每个点绘制一个球体,其直径根据误差而变化(直径 1 等于最大预期误差)。颜色代表时间。我将使用您添加到问题中的示例数据(格式为 5×4 矩阵,其中包含 xyt 和 @987654330 的列@数据):

data = [4 5 2 45; 4 5 6 54; 7 8 2 32; 7 8 9 98; 7 8 1 121];
[x, y, z] = sphere;  % Coordinate data for sphere
MAX_ERROR = 121;     % Maximum expected error
for i = 1:size(data, 1)
  c = 0.5*data(i, 4)/MAX_ERROR;  % Scale factor for sphere
  X = x.*c+data(i, 1);           % New X coordinates for sphere
  Y = y.*c+data(i, 2);           % New Y coordinates for sphere
  Z = z.*c+data(i, 3);           % New Z coordinates for sphere
  surface(X, Y, Z, 'EdgeColor', 'none');  % Plot sphere
  hold on
end
grid on
axis equal
view(-27, 16);
xlabel('x');
ylabel('y');
zlabel('t');

这就是它的样子:

问题:虽然情节看起来有点意思,但不是很直观。此外,以这种方式绘制大量点会变得杂乱无章,很难全部看清。

更直观的 3-D 绘图:

改为制作数据的 3-D 图可能会更好,因为它可能更容易解释。这里,x 轴代表迭代次数,y 轴代表每个单独的网络:

plot3(1:2, [1 1], [2 45; 6 54]);           % Plot data for network 4-5
hold on
plot3(1:3, [2 2 2], [2 32; 9 98; 1 121]);  % Plot data for network 7-8
xlabel('iteration number');
set(gca, 'YTick', [1 2], 'YTickLabel', {'network 4-5', 'network 7-8'})
grid on
legend('time', 'error')
view(-18, 30)

这会产生更清晰的情节:

【讨论】:

  • peaks 是一个内置的 MATLAB 函数,在 MATLAB 演示中经常用作 2 个变量的示例函数。
  • 那么,由于xy 的值不同,我应该如何定义XYZ 数组?
  • 我想我需要进一步了解您的数据具体是什么以及它是如何生成的才能回答这个问题。
  • @gnovice 我已在问题中添加了详细信息。请看一看。
【解决方案2】:

尽管我不相信这是可视化数据的最佳方式,但这里有一种简单的方法可以按照您的要求进行操作。您可以在简单的散点图中绘制 3D 点,并将大小或颜色映射到第四维 error 的值。比如:

x = randi(20, [10 1]);
y = randi(20, [10 1]);
t = randi(10, [10 1]);
e = randi(200, [10 1]);

% map `e` to color
figure(1)
scatter3(x, y, t, 200, e, 'filled')
xlabel('x'), ylabel('y'), zlabel('t')
colormap(hot), colorbar

% map `e` to size
figure(2)
scatter3(x, y, t, e, 'filled')
xlabel('x'), ylabel('y'), zlabel('t')

【讨论】:

  • @Amro 我在问题中添加了一个示例。请看一看。我不确定你的意思:you have two values across a time axis
  • 我好像误解了数据的样子!
  • 从上面的 cmets 中,et 是针对每个网络配置 (x,y) 测量的值,即:e = f(x,y)t = g(x,y)。因此,针对 (x,y) 和 e 绘制 t 是没有意义的。相反,IMO 你应该为每个函数有两个图
  • @Amro、et 是同一网络上不同迭代的 errortime 的值。因此,以这种方式绘制它们确实有意义。在上面的例子中,前几个文件,对于network 4-5,第一次迭代采用2 seconds,错误为45,而SAME网络上的第二次迭代采用6 seconds,错误为54。跨度>
  • 我的意思是,将error 绘制成三个变量(x,y,time) 的函数是没有意义的,因为它不依赖于time(x,y)time 只是同一输入的另一个函数(x,y)
猜你喜欢
  • 1970-01-01
  • 2011-11-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多