Matlab:曲面图绘制无效

5

我想绘制一个表面图。x是一个11个元素的向量,y是一个300个元素的向量,z是一个300*11个元素的矩阵。

当我尝试这样绘制它时:

surf(x y z)

表面图没有显示出来。坐标轴在那里,但是没有表面图。 blank surface plot 然而,如果出于某种原因我这样对矩阵的子集做表面图:
surf(x y(1:31) z(1:31,:))

然后它就能正常工作,绘图也会呈现出来。如果我将括号中的数字增加到32,它就停止工作了。如果我将范围从2:32改变,那么它就能正常工作,所以问题与数据无关,只与矩阵的大小有关。

这里发生了什么?我该如何解决?

附言:我想附上代码,但它有点长而且复杂,并且导入.txt文件加载到x和y向量中。


当您使用第一个命令绘图时,命令窗口中是否有任何红色文本? - Jonas
没有,一点红色的文本都没有。 - Eddy
1
也许您可以尝试更改图形的“Renderer”属性(painterszbufferOpenGL):http://www.mathworks.nl/help/techdoc/ref/figure_props.html - catchmeifyoutry
x、y和z的最大值和最小值是多少?它们包含任何NaN吗?我的第一个想法是它们包含非常大或非常小的值,这些值会破坏轴缩放。 - Bill Cheatham
@catchmeifyoutry 谢谢,一旦我在交互式图形属性中将渲染器更改为“painters”,它就起作用了。我如何使用命令设置渲染器为painters? - Eddy
@Eddy,很高兴它起作用了,我已经将其创建为答案,见下方。 - catchmeifyoutry
2个回答

6

有时候,改变Matlab的图形渲染器(即负责绘制的后端)会有所帮助。选项包括 painterszbufferOpenGL

由于这是一个图形属性,您可以将其应用于特定的图形,例如:

set(gcf(), 'Renderer', 'painters')

或者更新默认图形属性(如果总是需要,可以将其放在您的用户特定的startup.m文件中):

set(0, 'Renderer', 'painters')

同样地,要获取当前的渲染器状态,使用 get 而不是 set

get(gcf(), 'Renderer')

不同的渲染器具有不同的性能特点(例如,如果支持,则OpenGL渲染器可以使用硬件加速),但也具有不同的怪癖(根据我的经验,在使用远程桌面登录时使用getframe()进行帧捕获会与某些渲染器配合使用,而不是全部)。虽然我不知道你的问题的确切原因,但它可能是这些奇怪怪癖之一,所以尝试更改渲染器。
渲染器属性文档中:

用于屏幕和打印的渲染方法。 选择用于呈现MATLAB图形的方法。 选项为:

painters - MATLAB使用的原始呈现方法,当图中只包含简单或小型图形对象时更快。

zbuffer - MATLAB绘制图形对象更快且更精确,因为它按像素对对象进行着色,并且MATLAB仅渲染场景中可见的那些像素(因此可以消除前到后排序错误)。请注意,如果MATLAB显示复杂场景,则此方法可能会消耗大量系统内存。

OpenGL - OpenGL是一个渲染器,可在许多计算机系统上使用。此渲染器通常比painters或zbuffer更快,并且在某些情况下使MATLAB能够访问某些系统上可用的图形硬件。


1

看一下左侧(y轴)和顶部(z轴)的轴的最小/最大值的变化。我认为它仍然存在,但非常非常小。

尝试像这样设置轴: axis([6E-6 8E-6 9.2E14 10E14 0.96 1.06 -1 1])

注意:E-6可能是E-8,我无法从图像中确定...

这是基于代码:axis([xmin xmax ymin ymax zmin zmax cmin cmax])


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接