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

Dan*_*Dan 28 matlab plot

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

作为两个独立变量的函数的颜色和表面高度.

我应该用什么matlab绘图函数来制作一个二维网格图,其中因变量只表示为一种颜色?我正在寻找类似于pm3d mapgnuplot的东西.

gev*_*ang 41

默认情况下,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');
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

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

% 2D map using view
figure;
surf(Z,'EdgeColor','None');
view(2);    
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

...或将值Z作为矩阵处理,使用imagesc并选择适当的色彩图将其视为缩放图像.

% using imagesc to view just Z
figure;
imagesc(Z); 
colormap jet; 
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

地图的彩色调色板,通过控制colormap(map),其中map可以是定制的或通过任何提供MATLAB内置的色彩映射的:

在此输入图像描述

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

figure;
surf(X, Y, Z,'EdgeColor', 'None', 'facecolor', 'interp');
view(2);
axis equal; 
axis off;
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

  • 非常好的答案(+1).如果你添加''facecolor','interp'作为一个额外的命名属性,你会得到更平滑的颜色插值,而不是你现在得到的块状外观......另外,如果描述X和Y尺寸的向量是` xv`和`yv`,你可以用`imagesc(xv,yv,Z)`来获得轴的比例; 或者用'轴关闭'关闭x和y轴标记.您将获得与"轴图像"相同的X和Y缩放 - 防止图像被拉伸.最后,如果数据开始不在常规网格上,您希望使用`griddata`函数重新采样. (2认同)

Jus*_*tin 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;
Run Code Online (Sandbox Code Playgroud)

输出:

在此输入图像描述

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

在此输入图像描述


sta*_*rst 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
Run Code Online (Sandbox Code Playgroud)

冲浪vs imagesc

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

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

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