【问题标题】:How can I plot a single 2-D curve onto a colormap in Matlab?如何在 Matlab 中将单个二维曲线绘制到颜色图上?
【发布时间】:2019-12-17 04:42:29
【问题描述】:

我用 Matlab 中现有的编译数据创建了一个平滑的颜色渐变二维等高线图。我将 x 轴、y 轴和 z 数据轮廓绘制为颜色图。我的目标是在颜色图上绘制一条二维曲线,表示单个 z 数据值,但我不知道如何。

有谁知道如何在 3-D 颜色图上绘制 2-D 曲线?我提供了一个指向当前颜色图的链接,我希望在该颜色图上将单个 z 值绘制为曲线。

x = 0.05:0.05:1;
y = 0.0:0.05:1;
[X, Y] = meshgrid(x, y);
Z = [data]
contourf(X, Y, Z);
pcolor(X, Y, Z);
shading interp
title()
xlabel()
ylabel()
colorbar

【问题讨论】:

  • 您能否edit 将Z = [data] 包含为Minimal, Reproducible Example 并显示您获得的输出(并描述您想要的内容)?
  • 我刚刚添加了一个链接供您查看我已经拥有的颜色图!我想在颜色图上绘制一个自透射率值(z 数据)以显示特定的解决方案。

标签: matlab plot colormap contourf shading


【解决方案1】:

感谢@Cris Luengo 他的cmets 将我引导至contourc。请注意,contourc 返回等值线。根据文档,

要计算级别k 的单个轮廓,请使用contourc(Z,[k k])

这意味着我们可以通过
v = [.5 0.75 .85];
识别等值线的特定值(Z 的值) 然后使用循环迭代获取所需的信息

for k = 1:length(v)
    Ck = contourc(x,y,Z,[v(k) v(k)]);`
end

这允许我们将信息传递给下面代码中的plot(...)。

% MATLAB R2018b
x = 0:0.01:1;
y = 0:0.01:1;
[X,Y] = meshgrid(x,y);
Z = sqrt(X.^3+Y);     % Placeholder
v = [.5 0.75 .85];    % Values of Z to plot isolines

figure, hold on
pcolor(X, Y, Z); 
shading interp
colorbar
for k = 1:length(v)
    Ck = contourc(x,y,Z,[v(k) v(k)]);
    plot(Ck(1,2:end),Ck(2,2:end),'k-','LineWidth',2)
end

旧但有效:将在上述答案完成后删除

免责声明:可能有更简单的方法可以做到这一点。见底部注释。

x = 0:0.01:1;
y = 0:0.01:1;
[X,Y] = meshgrid(x,y);
Z = sqrt(X.^3+Y);          % Placeholder

plot 命令可以覆盖任何你想要的东西。或者您可以使用contourf 并指定标记的轮廓,包括highlighting individual contours。我已经说明了两种方法 - 我相信您正在寻找的方法使用 hold on; plot(...) ,如下所示并使用 left 图像。

在左图中,您会看到我使用了逻辑索引。

val = 0.75;         % Value of Z to plot contour for
tol = .002;         % numerical tolerance
idxZval = (Z <= val+tol) & (Z >= val-tol);

这种方法的成功很大程度上取决于Z 上的网格有多精细以及所需的容差 (tol)。如果 Z 网格受到数据的限制,那么您必须调整容差并根据自己的喜好或数据的限制进行调整。我只是简单地调整,直到得到下图并且没有进一步修补。

% MATLAB 2018b
figure
subplot(1,2,1) % LEFT
    pcolor(X, Y, Z); hold on
    shading interp
    xlabel('X')
    ylabel('Y')
    colorbar

    val = 0.75;         % Value of Z to plot contour for
    tol = .002;         % numerical tolerance
    idxZval = (Z <= val+tol) & (Z >= val-tol);
    plot(X(idxZval),Y(idxZval),'k-','LineWidth',2)
    title('Bootleg approach for Z = 0.75')

subplot(1,2,2) % RIGHT
    v =[0:.1:1.2]        % values of Z to plot as contours
    contourf(X,Y,Z,v)
    colorbar
    title('Contour plot specifying values v =[0:.1:1.2]')

编辑:
对于未来的访问者,如果X、Y 和Z 之间的关系已知,例如sqrt(X.^3 + Y) = Z,然后为特定的Z 值绘制一条曲线,可以通过求解方程直接从该关系(方程)中提取。如果它基于数据而不是分析公式,那么这可能会更困难,而上述方法可能更容易(感谢@Cris Luengo 在 cmets 中指出这一点)。

【讨论】:

  • 为什么说“这是一种劣等方法”?我认为这是正常的方式:hold on; plot(...)。没有太大的改进。提取二维曲线可能会更好,例如通过求解sqrt(X.^3+Y)=val,但推测OP已经有了二维曲线的数据。
  • 刚刚发现您或其他 MATLAB Jedi 会以某种巧妙的方式知道我不知道。我同意为plot(...) 提取二维曲线肯定更好。没有走这条路,因为 OP 在这个问题上只包括 Z = [data] 我认为是 precursor。
  • 感谢@CrisLuengo,我编辑了答案并在底部添加了一条注释。
  • 我同意! Here 是contourc 的输出矩阵的文档。为每条轮廓线获取该矩阵的正确位并非易事。只需在循环中调用contourc 就更简单了。
  • 非常感谢大家!我能够绘制曲线!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-04-05
  • 1970-01-01
  • 2017-01-27
  • 1970-01-01
  • 1970-01-01
  • 2020-09-26
  • 1970-01-01
相关资源
最近更新 更多