如何在Matlab中绘制第二个图表而不是使用颜色编码?

5
我刚开始写我的硕士论文,但是我对MATLAB的能力/理解已经有困难了。
问题在于,我有一个行星/卫星表面上的轨迹(一个.mat文件,包含时间和坐标),然后我有一些时间和测量值的.mat文件。
我可以在scatter()中将它们绘制成颜色编码的轨迹。这很好用。
但是我的问题是,我需要更复杂的东西。 现在我需要将轨迹与测量值的图表(由每个点给出)相加,而不是对其进行颜色编码(轨迹不总是直线)。我会添加一个小草图来解释我的要求。红箭头表示我想要添加到我的图表中的内容,而绿色则表示我当前拥有的内容。

1
在开始绘制图形之前,请尝试使用“hold on”。如果现在绘制其他内容,则该内容将被绘制在您的图形内部。 - user238801
谢谢,但这根本不是问题所在...问题是我想在与线(和点)形成直角的特定距离上绘制点。 - IceQueeny
也许在黑线图上(同样是“旋转”的)添加一个y轴会更好。 - IceQueeny
不确定是否有帮助,但您可能想查看 doc rotate。此外,它并没有回答问题,但根据其值着色该行会更容易,而不是将其定位在某条对角线上方。 - Dennis Jaheruddin
那我不明白你的问题,你基本上将你的线作为x轴,并通过添加你的线的坐标(绿色箭头)来转换图形(红色箭头)。如果绿色箭头不是一条直线,请插值这些点并将其视为您的x轴(它不是线性的,而是多项式的)。如果它不是线性的,但您想将其视为一条直线,请进行线性回归。 - user238801
忘了提到,为了正确绘制线条或插值,您当然需要该线条或插值的表面法线,但我认为这更适用于math.stackexchange而不是stackoverflow。 - user238801
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);

parabole_sine

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

circle_sine


非常感谢。这看起来是我问题的一个很好的解决方案。我会在再次访问我的数据时尽快尝试它。 - IceQueeny
+1:确实,如果角度未知,您将需要轨迹的梯度。 - Eitan T
嗨,冈瑟。 不知怎么回事,我还是有困难。 一个错误显示矩阵尺寸不同。 我只输入了一个 (63---x1),这样应该可以,或者不行吗?'Error using horzcat Dimensions of matrices being concatenated are not consistent.Error in DensGeo (line 99) dx = [dx(1) dx]; % forward finite difference for 1th point'另外,如果我跳过这一部分,下一个不一致性会在规范化部分出现:'Error using ./ Matrix dimensions must agree.Error in DensGeo (line 109) curve_norm = curve_norm ./ repmat(sqrt(sum(abs(curve_norm).^2,1)),2,1);' - IceQueeny
1
我的代码是针对行向量设计的,而你正在使用的是列向量。为了快速解决问题:转置你的输入。 - Gunther Struyf

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')

现在让我们将点(由xy的值指定)以45度角绕(0,0)旋转:
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. 坐标轴被调整为正方形,以避免失真。
这是你应该得到的结果:

enter image description here


这也是我的第一个想法,但轨迹可能不是一条直线。我认为你甚至可以在OP的示例图中看到这一点,因此需要曲线梯度。 - Gunther Struyf
1
谢谢你。是的,Gunter Struyf是正确的,我的轨迹并不总是经过原点(我需要分析超过10个数据集)。此外,我绘制极坐标(这些坐标被转换为笛卡尔坐标系),因此原点位于图片中央。我也可能不知道它直接形成的角度。但对于这些情况(通过原点和直线),这仍然是一个不错的解决方案。 - IceQueeny
如果你不知道你确实需要梯度的角度,就像Gunther建议的那样,@IceQueeny。 - Eitan T

0

看起来你对3D绘图很感兴趣。 如果我理解你的问题正确,你有一个用[x(t), y(t)]表示的2D曲线。 此外,每个点都有一些值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版本

scatter3( x, y, m );

选择你的喜好。

顺便说一句,画得不错。

祝你论文顺利。


非常感谢。但我的计划是将我的3D数据保留在2D中,这样我就可以将测量值与我的星球/月球地面的地理特征(如间歇泉或裂缝)进行比较。我能够放入背景图像,这没有问题。 - IceQueeny

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接