【问题标题】:How to plot a second graph instead of color coding in matlab如何在matlab中绘制第二个图而不是颜色编码
【发布时间】:2012-12-27 11:15:04
【问题描述】:

我刚开始写硕士论文,我对 matlab 的能力/理解已经有问题了。

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

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

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

【问题讨论】:

  • 在开始绘制图形之前尝试“坚持”。如果您现在绘制其他内容,它将被绘制在您的图表中。
  • 谢谢,但这根本不是问题。问题是我想在与直线(和点)成直角的特定距离上绘制点。
  • 也许在黑线图上添加一个 y 轴也很好(这也是“旋转的”)
  • 不确定它是否有帮助,但您可能想查看doc rotate 此外,它没有回答问题,但根据它的值着色线条会更容易,而不是定位一条对角线上方的线。
  • 那我不明白你的问题,你基本上把你的线作为 x 轴并通过添加你的线的坐标(绿色箭头)来转换图形(红色箭头)。如果绿色不是一条线,则对这些点进行插值并将其视为您的 x 轴(这不是线性的,而是有点多项式)。如果它不是线性的,但您想将其视为一条线,请进行线性回归。

标签: matlab graph colors


【解决方案1】:

您始终可以自己转换数据:(使用与@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);

【讨论】:

  • 非常感谢。这看起来确实是我的问题的绝佳解决方案。我将在再次访问我的数据后立即尝试。
  • +1:确实,如果角度未知,您将需要轨迹的梯度。
  • 你好,冈瑟。不知何故,我仍然很难做到这一点。错误显示矩阵的维度不同。我只输入一个 (63--- x 1) 因此应该可以吗? '使用 horzcat 时出错 被连接的矩阵的维数不一致。 DensGeo 中的错误(第 99 行)dx = [dx(1) dx];第 1 点的 % 前向有限差​​分”此外,如果我跳过这部分,下一个不一致会出现在标准化部分:“使用 ./ 矩阵尺寸的错误必须一致。 DensGeo 中的错误(第 109 行)curve_norm = curve_norm ./ repmat(sqrt(sum(abs(curve_norm).^2,1)),2,1);'
  • 我的代码用于行向量,您使用的是列向量。快速修复:transpose您的输入
【解决方案2】:

如果我正确理解您的问题,您需要将实际数据围绕原点以一定角度旋转。这非常简单,因为您只需要将坐标乘以rotation matrix。然后,您可以按照 cmets 中的建议,使用 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 的值指定)围绕 (0, 0) 以 45° 角旋转:

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. 坐标轴已成平方以避免变形。

这是你应该得到的:

【讨论】:

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

您似乎对 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 );

选择你的选择。

顺便说一句,情节不错。

祝你的论文好运。

【讨论】:

  • 非常感谢。但我的计划是将我的 3D 数据保留为 2D,以便我可以将测量值与我的星球/月球地面上的地理特征(如间歇泉或裂缝)进行比较。我可以把背景图片放进去,没问题..
猜你喜欢
  • 2020-09-26
  • 1970-01-01
  • 2012-06-04
  • 1970-01-01
  • 2013-01-12
  • 1970-01-01
  • 2011-10-10
  • 2015-02-22
  • 1970-01-01
相关资源
最近更新 更多