28

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

作为两个自变量的函数的颜色和表面高度。

我应该使用什么 matlab 绘图函数来制作因变量仅表示为颜色的 2D 网格图?我正在寻找类似pm3d mapgnuplot 的东西。

4

4 回答 4

42

默认情况下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

% 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;

在此处输入图像描述

于 2013-04-02T01:24:40.097 回答
19

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

在此处输入图像描述

于 2013-04-02T04:06:55.410 回答
5

请注意,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)”值 - 尽管这是一种肮脏的方法)。

于 2015-03-02T22:05:11.743 回答
2

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

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

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

抱歉,如果这与原始帖子无关

于 2014-05-14T11:30:03.660 回答