5

我刚开始我的硕士论文,我已经在我的 matlab 能力/理解方面遇到了麻烦。

问题是,我在行星/月球的表面上有一条轨迹(一个带有时间和坐标的.mat。然后我有一些带有时间和当时测量值的.mat。

我可以在 scatter() 中将其绘制为彩色编码轨迹(使用测量值和坐标)。这非常好用。

但是我的问题是我需要更复杂的东西。我现在需要获取轨迹,而不是对其进行颜色编码,我应该将测量的图形(值)(为每个点给出)添加到轨迹(并不总是一条直线)。我将添加一个小草图来解释我想要什么。红色箭头显示我想要添加到情节中的内容,绿色显示我拥有的内容。

在此处输入图像描述

4

3 回答 3

5

您始终可以自己转换数据:(使用与@Shai 相同的符号)

x = 0:0.1:10;
y = x;
m = 10*sin(x);

所以你需要的是每个数据点处曲线的法线向量:

dx = diff(x); % backward finite differences for 2:end points
dx = [dx(1) dx]; % forward finite difference for 1th point
dy = diff(y);
dy = [dy(1) dy];
curve_tang = [dx ; dy];
% rotate tangential vectors 90° counterclockwise
curve_norm = [-dy; dx];
% normalize the vectors:
nrm_cn = sqrt(sum(abs(curve_norm).^2,1));
curve_norm = curve_norm ./ repmat(sqrt(sum(abs(curve_norm).^2,1)),2,1);

将该向量乘以测量值 ( m),用数据点坐标偏移它,就完成了:

mx = x + curve_norm(1,:).*m;
my = y + curve_norm(2,:).*m;

绘制它:

figure; hold on
axis equal;
scatter(x,y,[],m);
plot(mx,my)

直线_正弦

这正是您想要的。这个例子只有一条直线作为坐标,但是这段代码可以很好地处理任何曲线:

x=0:0.1:10;y=x.^2;m=sin(x);

抛物线正弦

t=0:pi/50:2*pi;x=5*cos(t);y=5*sin(t);m=sin(5*t);

circle_sine

于 2012-12-27T13:21:18.363 回答
5

如果我正确理解您的问题,您需要以一定角度围绕原点旋转实际数据。这非常简单,因为您只需要将坐标乘以旋转矩阵。然后,您可以按照评论中的建议,使用hold onplot用旋转点覆盖您的图。

例子

首先,让我们生成一些类似于您的数据并创建散点图:

% # Generate some data
t = -20:0.1:20;
idx = (t ~= 0);
y = ones(size(t));
y(idx) = abs(sin(t(idx)) ./ t(idx)) .^ 0.25;

% # Create a scatter plot
x = 1:numel(y);
figure
scatter(x, x, 10, y, 'filled')

现在让我们围绕 (0, 0) 以 45° 角旋转点(由 和 的值指定x) :y

P = [x(:) * sqrt(2), y(:) * 100] * [1, 1; -1, 1] / sqrt(2);

然后将它们绘制在散点图的顶部:

hold on
axis square
plot(P(:, 1), P(:, 2))

请注意,出于可视化目的,此处已完成其他操作:

  1. 最终的 x 坐标已被拉伸(由sqrt(2))到适当的长度。
  2. 最终的 y 坐标已被放大(放大 100),以便旋转后的图突出。
  3. 轴已成平方以避免失真。

这是你应该得到的:

在此处输入图像描述

于 2012-12-27T13:28:10.597 回答
0

您似乎对 3D 绘图感兴趣。如果我正确理解您的问题,您的二维曲线表示为[x(t), y(t)]。此外,您对每个点都有一些价值m(t)。因此,我们正在查看 3D 曲线图[x(t) y(t) m(t)]。你可以很容易地使用

plot3( x, y, m ); % assuming x,y, and m are sorted w.r.t t

或者,您可以使用 3D 版本的 scatter

scatter3( x, y, m );

选择你的选择。

不错的情节顺便说一句。

祝你的论文好运。

于 2012-12-27T12:13:23.247 回答