Matlab:网格数量较少的`mesh()`图

Matlab: `mesh()` plot with less number of grid

假设 data 是大小为 129 * 129 的矩阵。

通过使用

mesh(data, 'FaceColor', 'none', 'EdgeColor', 'black')

我们得到类似

的东西

我们可以发现格子很密集。我想要相同的图形,但网格线数量 较少 ,类似于


当然可以绘制较小的 data,例如 data(1:10:end, 1:10:end)。但是这样一来,剧情就没有以前那么准确了。

另一个例子是plot(..., 'MarkerIndices', ...)。这可以在不修改绘图的情况下为您提供标记数量较少的绘图。 https://www.mathworks.com/help/matlab/creating_plots/create-line-plot-with-markers.html

我认为你最好的选择是创建一个 surf plot with no grid lines (showing a colored surface with the full resolution of your data), then overlay a down-sampled mesh 情节。像这样:

surf(data, 'EdgeColor', 'none');
hold on;
mesh(data(1:10:end, 1:10:end), 'EdgeColor', 'black');

您还可以向 surf 图添加一些透明度,使网格通过它可见:

surf(data, 'FaceAlpha', 0.7, 'EdgeColor', 'none');

另一种方法是使用 plot3 手动绘制网格线。这样你就可以使用所有数据点平滑地绘制每条线,但没有那么多线。

[X,Y,Z] = peaks(201);
step = 5;

plot3(X(:,1:step:end),Y(:,1:step:end),Z(:,1:step:end),'k')
hold on
plot3(X(1:step:end,:).',Y(1:step:end,:).',Z(1:step:end,:).','k')
hold off

@David 的回答很好。除了他的做法,我们还可以用很多无穷小的mesh代替plot3。这个想法是多次为单个向量绘制 mesh

[X,Y,Z] = peaks(201);

tempz = NaN(201, 201);

tempz(1, :) = Z(1, :);
mesh(X, Y, tempz, 'EdgeColor', 'interp');
hold on

% plot x lines
for i = 2:10:201
    tempz = NaN(201, 201);
    tempz(i, :) = Z(i, :);
    mesh(X, Y, tempz, 'EdgeColor', 'interp');
end

% plot y lines
for i = 2:10:201
    tempz = NaN(201, 201);
    tempz(:, i) = Z(:, i);
    mesh(X, Y, tempz, 'EdgeColor', 'interp');
end

原来是

通过使用上面的代码片段,它给出了

与@David 的回答相比,这样做的好处是您可以保留 mesh 的所有奇特属性,例如 shading interp