我有一些以 matlab 格式存储的数据(两个参数的函数),我想用 matlab 来绘制它。一旦我读入数据,我就用它mesh()
来制作一个情节。我的mesh()
情节给了我函数的值作为颜色和表面高度,如下所示:
我应该使用什么 matlab 绘图函数来制作因变量仅表示为颜色的 2D 网格图?我正在寻找类似pm3d map
gnuplot 的东西。
默认情况下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;
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
):
请注意,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)”值 - 尽管这是一种肮脏的方法)。
我还建议使用contourf(Z)
. 对于我的问题,我想在 2D 中可视化 3D 直方图,但轮廓过于平滑,无法表示直方图条的顶视图。
所以就我而言,我更喜欢使用 jucestain 的答案。默认shading faceted
的pcolor()
更合适。但是,pcolor()
不使用绘制矩阵的最后一行和最后一列。为此,我使用了以下padarray()
功能:
pcolor(padarray(Z,[1 1],0,'post'))
抱歉,如果这与原始帖子无关