【问题标题】:How can I make a "color map" plot in matlab?如何在 matlab 中制作“彩色地图”图?
【发布时间】:2019-12-18 16:15:22
【问题描述】:

我有一些以 matlab 格式存储的数据(两个参数的函数),我想使用 matlab 来绘制它。读入数据后,我使用mesh() 绘制图表。我的mesh() 绘图为我提供了函数的值作为颜色和表面高度,如下所示:

我应该使用什么 matlab 绘图函数来制作 2D 网格图,其中因变量表示为仅一种颜色?我正在 gnuplot 中寻找类似 @​​987654324@ 的东西。

【问题讨论】:

  • gnuplot 函数与 Matlab 的网格有何不同?使用 Mesh,颜色与表面高度成正比。
  • 我不想要表面;我只想要一张带颜色的 2D 地图。

标签: matlab plot


【解决方案1】:

默认情况下,mesh 将根据(默认)jet 颜色图对表面值进行着色(即热度更高)。您还可以使用surf 填充表面补丁并将'EdgeColor' 属性设置为'None'(因此补丁边缘不可见)。

[X,Y] = meshgrid(-8:.5:8);
R = sqrt(X.^2 + Y.^2) + eps;
Z = sin(R)./R;

% surface in 3D
figure;
surf(Z,'EdgeColor','None');

2D地图:切换图形的view属性可以得到2D地图

% 2D map using view
figure;
surf(Z,'EdgeColor','None');
view(2);    

... 或将Z 中的值视为矩阵,使用imagesc 将其视为缩放图像并选择适当的colormap

% using imagesc to view just Z
figure;
imagesc(Z); 
colormap jet; 

地图的调色板由colormap(map)控制,其中map可以是自定义的或MATLAB提供的任何内置颜色图:

更新/优化地图:地图上的几个设计选项(分辨率、平滑、轴等)可以通过常规 MATLAB 选项进行控制。正如@Floris 指出的那样,这里是一个平滑的、等轴的、无轴标签的地图,适用于这个例子:

figure;
surf(X, Y, Z,'EdgeColor', 'None', 'facecolor', 'interp');
view(2);
axis equal; 
axis off;

【讨论】:

  • 非常好的答案(+1)。如果您将'facecolor', 'interp' 添加为附加的命名属性,您将获得更平滑的颜色插值,而不是您现在得到的块状外观......此外,如果描述 X 和 Y 维度的向量是 xvyv ,您可以使用imagesc(xv, yv, Z) 缩放轴;或使用axis off 关闭 x 和 y 轴标签。您将获得与axis image 相同的 X 和 Y 缩放 - 防止图像被拉伸。最后,如果数据开始时不在常规网格上,您需要使用griddata 函数重新采样。
  • @Floris 以上所有要点!将更新以反映一些。许多这些和类似的选项(分辨率、粗略或精细、规则网格等)将取决于数据表示和映射的需要。
  • 谢谢 - 你是对的。但是即使是粗略的数据,插值之类的东西也会有所帮助,并且让轴正确地反映 X 和 Y 的比例在我看来是必不可少的。如果您没有正确标记它们,请根本不要标记它们 (axis off)。你的回答太好了,我想帮助它变得更好。
【解决方案2】:

gevang 的回答很棒。还有另一种方法可以使用pcolor 直接执行此操作。代码:

[X,Y] = meshgrid(-8:.5:8);
R = sqrt(X.^2 + Y.^2) + eps;
Z = sin(R)./R;
figure;
subplot(1,3,1);
pcolor(X,Y,Z); 
subplot(1,3,2);
pcolor(X,Y,Z); shading flat;
subplot(1,3,3);
pcolor(X,Y,Z); shading interp;

输出:

另外,pcolor 也是平坦的,如图所示(pcolor 是 2d 基础;上面的 3d 图形是使用 mesh 生成的):

【讨论】:

    【解决方案3】:

    请注意,pcolor 和“surf + view(2)”都不会显示 2D 数据的最后一行和最后一列。

    另一方面,使用 imagesc 时,您必须小心轴。仅 gevang 的答案中的 surf 和 imagesc 示例(几乎 - 除了最后一行和最后一列)彼此对应,因为 2D sinc 函数是对称的。

    为了说明这两点,我用以下代码制作了下图:

    [x, y] = meshgrid(1:10,1:5);
    z      = x.^3 + y.^3;
    
    subplot(3,1,1)
    imagesc(flipud(z)), axis equal tight, colorbar
    set(gca, 'YTick', 1:5, 'YTickLabel', 5:-1:1);
    title('imagesc')
    
    subplot(3,1,2)
    surf(x,y,z,'EdgeColor','None'), view(2), axis equal tight, colorbar
    title('surf with view(2)')
    
    subplot(3,1,3)
    imagesc(flipud(z)), axis equal tight, colorbar
    axis([0.5 9.5 1.5 5.5])
    set(gca, 'YTick', 1:5, 'YTickLabel', 5:-1:1);
    title('imagesc cropped')
    
    colormap jet
    

    如您所见,冲浪图中缺少第 10 行和第 5 列。 (您也可以在其他答案的图片中看到这一点。)

    如果 x 和 y 不是 1:1:N,请注意如何使用“set(gca, 'YTick'...”(和 Xtick)命令正确设置 x 和 y 刻度标签。

    还请注意,仅当您的 z 数据对应于 xs 和 ys (每个)等距时,imagesc 才有意义。如果不是,您可以使用 surf(并可能复制最后一列和最后一行以及一个“(end,end)”值 - 尽管这是一种肮脏的方法)。

    【讨论】:

      【解决方案4】:

      我还建议使用contourf(Z)。对于我的问题,我想在 2D 中可视化 3D 直方图,但轮廓过于平滑,无法表示直方图条的顶视图。

      所以就我而言,我更喜欢使用 jucestain 的答案。 pcolor()的默认shading faceted比较合适。 但是,pcolor() 不使用绘制矩阵的最后一行和最后一列。为此,我使用了padarray() 函数:

      pcolor(padarray(Z,[1 1],0,'post'))
      

      对不起,如果这与原始帖子没有真正的关系

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-08-02
        • 1970-01-01
        • 1970-01-01
        • 2019-10-16
        • 2023-03-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多