【发布时间】:2015-07-11 17:47:09
【问题描述】:
我想使用 MATLAB 绘制函数(当然是用矩阵表示)的高度线。
我对等高线很熟悉,但等高线在等高处绘制线条,而我希望看到线条(带有高度标签),在绘制时彼此保持恒定距离。
这意味着如果一个函数在一个区域快速增长,我将不会得到一个高度线密集的图,而是只有几条线,且间距均匀。
我试图在轮廓帮助页面中找到这样的选项,但什么也看不到。有没有内置函数可以做到这一点?
【问题讨论】:
我想使用 MATLAB 绘制函数(当然是用矩阵表示)的高度线。
我对等高线很熟悉,但等高线在等高处绘制线条,而我希望看到线条(带有高度标签),在绘制时彼此保持恒定距离。
这意味着如果一个函数在一个区域快速增长,我将不会得到一个高度线密集的图,而是只有几条线,且间距均匀。
我试图在轮廓帮助页面中找到这样的选项,但什么也看不到。有没有内置函数可以做到这一点?
【问题讨论】:
没有内置函数可以做到这一点(据我所知)。您必须意识到,在一般情况下,您不能有既代表等值又以固定距离间隔开的线。这仅适用于具有特殊缩放属性的绘图,而且这不是一般情况。
话虽如此,您可以想象通过使用指定绘图级别的语法来接近您想要的绘图:
...
contour(Z,v) draws a contour plot of matrix Z with contour lines at the data values specified in the monotonically increasing vector v.
...
所以你所需要的只是高度值的良好向量v。为此,我们可以采用经典的 Matlab 示例:
[X,Y,Z] = peaks;
contour(X,Y,Z,10);
axis equal
colorbar
并将其转换为:
[X,Y,Z] = peaks;
[~, I] = sort(Z(:));
v = Z(I(round(linspace(1, numel(Z),10))));
contour(X,Y,Z,v);
axis equal
colorbar
结果可能不如您预期的那么好,但这是我能想到的最好的结果,因为您再次提出的问题是不可能的。
最好的,
【讨论】:
您可以做的一件事是,不要在等间距级别绘制等高线(当您将整数传递给等高线时会发生这种情况),而是在数据的固定percentiles 上绘制等高线(这需要通过水平到轮廓的向量):
Z = peaks(100); % generate some pretty data
nlevel = 30;
subplot(121)
contour(Z, nlevel) % spaced equally between min(Z(:)) and max(Z(:))
title('Contours at fixed height')
subplot(122)
levels = prctile(Z(:), linspace(0, 100, nlevel));
contour(Z, levels); % at given levels
title('Contours at fixed percentiles')
结果:
对于右图,大部分图像的线条间距大致相等。请注意,间距只是近似相等,不可能在整个图像上获得相等的间距,除非在一些微不足道的情况下。
【讨论】: