你有没有遇到过这种情况?在Matlab里敲完绘图代码,点击运行按钮,命令行里显示“已完成”,但屏幕上就是没有任何图形窗口弹出来?我刚开始学Matlab的时候,这个问题困扰了我整整一下午——明明代码看起来天衣无缝,为什么图就是不出来?后来查了无数资料,问了实验室的师兄师姐,才总结出这8个最常见的坑点,今天就分享给大家,帮你避开这些雷区!
讲真的,这个坑我踩过不止一次!有时候Matlab的图形窗口并没有消失,只是被其他窗口挡住了,或者被最小化到任务栏里。比如你打开了浏览器、Word文档,Matlab的figure窗口可能就乖乖待在这些窗口的后面,你不主动切换根本看不到它。
解决办法:
- 按Alt+Tab键切换窗口,看看有没有Matlab的图形窗口;
- 直接点击任务栏上的Matlab图标,展开所有打开的窗口,找到那个带“Figure”字样的窗口;
- 下次运行代码前,先把其他窗口最小化,让Matlab窗口在最前面。
我之前犯过一个超级蠢的错误:把变量名写成了“Y”而不是“y”,结果程序运行时命令行里飘着一行警告,但我只顾着等图出来,完全没注意到!Matlab对变量名是大小写敏感的,如果你在plot(x,y)里把y写成Y,或者把x写成X,那肯定不会出图——因为变量根本不存在啊!
解决办法:
- 运行代码后,先看命令行有没有红色的错误提示或黄色的警告;
- 检查绘图命令里的变量名是否和你定义的一致;
- 可以在命令行输入变量名,看看变量是否存在(比如输入x,回车,看有没有数据输出)。
有时候你在脚本里写了多个绘图命令,但Matlab可能会把它们都放在同一个窗口里,或者因为没有强制刷新而延迟显示。比如你写了plot(x1,y1),然后又写了plot(x2,y2),但第二个图覆盖了第一个,或者两个图都没显示出来。还有一种情况是,在循环里绘图,Matlab会等到循环结束才一起显示,这时候你就看不到实时的图了。
解决办法:
- 在每个绘图命令前加一句figure(),比如figure(1); plot(x1,y1); figure(2); plot(x2,y2); 这样每个图都会在新窗口显示;
- 在循环里绘图时,加一句drawnow(),强制Matlab立即刷新图形(比如for i=1:100; plot(i,rand()); drawnow; end;);
- 如果想让多个图在同一个窗口里显示,加hold on命令(比如plot(x1,y1); hold on; plot(x2,y2); hold off;)。
这个情况比较隐蔽——如果你不小心在代码里加了figure('visible','off'),那图肯定不会显示出来!或者你之前运行过某个脚本,把图形窗口的可见性改成了off,然后忘记改回来了。Matlab的figure窗口有个visible属性,默认是on,但如果被改成off,就会隐藏起来。
解决办法:
- 检查代码里有没有figure('visible','off')这样的语句,如果有,把off改成on;
- 在命令行输入set(0,'DefaultFigureVisible','on'),设置默认图形窗口为可见;
- 如果已经运行了代码,可以输入figure(1); set(gcf,'visible','on'),把第一个图形窗口显示出来(gcf代表当前图形窗口)。
比如你想画plot(x,y),但x是1×10的数组,y是1×20的数组,这时候Matlab会报错,因为两个变量的长度不一样。或者你的数据是空数组(比如x=[]),那也不会出图。
解决办法:
- 检查x和y的维度是否一致:输入size(x)和size(y),看看行数和列数是否相同;
- 如果数据是空的,检查你的计算过程是否正确(比如有没有哪里把数据清空了);
- 如果数据维度不一样,可以用reshape命令调整,或者用meshgrid生成网格数据(比如画3D图时)。
有时候Matlab的图形渲染会抽风,比如你不小心设置了opengl的模式,或者显卡驱动太老导致渲染失败。我之前遇到过一次:运行代码后,图形窗口弹出来了,但里面是空白的,没有任何线条。后来查了资料,发现是opengl的问题。
解决办法:
- 尝试重启Matlab,有时候重启就能解决问题;
- 在命令行输入opengl('save','software'),切换到软件渲染模式(如果你的显卡驱动有问题,这个方法很有效);
- 更新你的显卡驱动,确保显卡驱动是最新的;
- 如果是3D图(比如mesh、surf),可以尝试简化数据,比如减少点的数量,看看是否能显示。
如果你是在函数里写绘图代码,那要注意:函数运行结束后,所有局部变量都会被释放,但图形窗口不会自动关闭——除非你在函数里设置了关闭。不过有时候,函数里的图形窗口会被隐藏,或者因为函数没有返回值而被忽略。比如你写了一个函数function myplot() plot(1:10); end; 运行myplot()后,图形窗口应该会显示,但如果你的函数里有其他操作,可能会影响显示。
解决办法:
- 在函数里的绘图命令后加一句hold on或者drawnow;
- 如果函数需要返回图形对象,可以把图形句柄返回(比如function h=myplot() h=plot(1:10); end;);
- 运行函数后,检查任务栏是否有Matlab的图形窗口。
如果你的数据量太大(比如几百万甚至几千万个点),Matlab可能需要很长时间来处理,或者直接因为内存不够而无法显示图。我之前处理一个100万行的数据集,想画折线图,结果Matlab卡了十分钟,最后还是没出图——因为数据太多了,图形渲染不过来。
解决办法:
- 采样一部分数据来绘图,比如用x=x(1:1000); y=y(1:1000); 取前1000个点;
- 用更高效的绘图函数,比如plot3代替mesh(如果是3D图),或者用histogram代替bar(如果是直方图);
- 关闭其他不需要的程序,释放内存,再重新运行代码。
其实Matlab没出图的原因大多是小细节没注意到,只要你按照以下步骤排查,99%的情况都能解决:
1. 先看命令行有没有错误或警告;
2. 检查变量名和数据是否正确;
3. 看看图形窗口是不是被藏起来了;
4. 尝试加figure或drawnow命令;
5. 重启Matlab或更新显卡驱动。
我现在想起当初第一次遇到这个问题时的崩溃,觉得特别好笑——原来只是图形窗口被最小化了!所以下次遇到Matlab没出图的情况,别着急删代码重写,先按上面的方法排查一遍,相信你很快就能找到问题所在!
最后,祝大家在Matlab的世界里画图顺利,再也不用为“没图”烦恼啦!