如何在matlab中制作“彩色地图”图?

时间:2013-04-02 01:05:24

标签: matlab plot

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

A color and a surface height as a function of two independent variables.

我应该使用什么样的matlab绘图函数来制作2D网格图,其中因变量表示为只有颜色?我在gnuplot中寻找像pm3d map这样的东西。

4 个答案:

答案 0 :(得分: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');

enter image description here

2D地图:您可以通过切换图的view属性来获取2D地图

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

enter image description here

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

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

enter image description here

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

enter image description here

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

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

enter image description here

答案 1 :(得分: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;

输出:

enter image description here

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

enter image description here

答案 2 :(得分: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

surf vs imagesc

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

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

另请注意,只有当z数据对应于xs且ys(每个)等间距时,imagesc才有意义。如果不是,你可以使用冲浪(并且可能复制最后一列和一行以及另外一个"(结束,结束)"值 - 虽然这是一种肮脏的方法)。

答案 3 :(得分:2)

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

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

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

很抱歉,如果这与原始帖子没有关系