稻香 发表于 2022-1-14 16:59:15

Matlab有用的小工具小技巧

目录1.使图形窗口的默认text解释器为latex2.图形窗口最大化3.双坐标4.计时5.局部放大子图6.Figure缩放字体7.legend的Marker,line的属性操作(多legend,曲线减少marker数)8.eps图片在latex中显示不全9.坐标轴被遮住、保存后消失10.使用一个目录下的全部或某类文件11. [原创]eps图片中使用隐含信息做标注12. 生成高质量透明矢量图13. imagesc中对nan的处理14. 数据量比较大时保存真矢量eps图15. 坐标轴在图形中最大化16. eps图嵌入字体17. 曲面使用一种颜色的巧办法
1.使当前图形窗口的默认text解释器为latex:set(gcf,'DefaultTextInterpreter','latex')同理可推广:set(0,'DefaultTextInterpreter','latex')但是legend的解释器似乎不受这个设置影响?(可以用'Interpreter','latex'来设置,但是感觉还是不爽。)2.使图形窗口最大化:set(gcf,'outerposition',get(0,'screensize'))3.双坐标=plotyy(,);这将在左边的坐标轴里画两条曲线(x1,y1)和(x2,y2),而右坐标轴画一条(x3,y3)对于坐标轴的一些设置可以通过返回值来进行操作set(gcf,'CurrentAxes',hax(1))//把当前坐标轴调成左边的坐标轴set(gca,'Ylabel','xxxx')//然后就可以正常操作这个坐标轴,也可以使用hold on,增加曲线4.计时t0 = cputime; 程序;time=cputime-t0;tic; 程序;toc;t0 = clock; 程序;time = etime(clock, t0);5. 局部放大子图有一个mmzoom的扩展,可以用鼠标选区域来放大,用起来也挺好,不过不利于精确控制。其实,要自己画子图也不难:myzoom(,)通过笔者自己写的简单函数来实现放大:function myzoom(position,axiscale)ha=get(gcf,'CurrentAxes');ha1=copyobj(gca,gcf);set(ha1,'position',position)set(gcf,'CurrentAxes',ha1)axis(axiscale)xlabel('')ylabel('')set(gcf,'CurrentAxes',ha)其中position是字图在当前图中的相对位置和大小,是你要放大的坐标范围。6. Figure缩放字体问题让字体随figure的比例随你设置的缩放比例而变:hf=figure;fp=get(hf,'position');times=2.0; %自定义缩放倍数,set(hf,'position',) %figure的缩放set(gca,'FontSize',times*get(gca,'FontSize')) %gca上各种字体的缩放xlabel('X') %label在gca的fontsize设定之后写,不用再单独去设置它的字体ylabel('Y')hc=colorbar;set(hc,'FontSize',times*get(hc,'FontSize')) %假设有colorbar,实际上就是另外一个axes,同样设置它的字体参考:http://blog.csdn.net/benjmzhu/article/details/7246870 看了这个这里才知道输出格式还可以在Export Setup里设置的,而set(findall(gcf,'-property','FontSize'),'FontSize',12)可以把所有的对象中字体大小都改到12号!7.legend的Marker,line等的操作有这样一个情况,曲线太多,用线型来表示是不够的,只能用Marker、颜色结合线型来做。一般杂志还有要求,就是不用彩色也能说明每条曲线的意义,这样就只能用Marker结合线型来做。但是如果杯具的是你的数据点太多,导致marker太多,全画上的话根本看不清了。解决这个问题最简单的方法是:……哈哈,直接调用现成函数(笔者在原作者的基础上做了一点修订,使之在横坐标和纵坐标范围相差数值上很大时也能用,大家也可以考虑一下log坐标的问题),当在使用legend后再使用这个函数,不会影响legend:"nummarkers.m" http://pan.baidu.com/share/link?shareid=1072992811&uk=151290240之前自己用的办法其实原理上是一致的,也是用线把不同颜色的曲线画一遍,然后每条曲线少用点Marker再画一遍,这样涉及到legend怎么展示,就是要对legend的线型、颜色进行自定义。x=0:0.0001:2*pi;y1=sin(x);y2=cos(x);figurehold onbox onn=1000;hl(1)=plot(x(1:n:end),y1(1:n:end),'rd');hl(2)=plot(x(1:n:end),y2(1:n:end),'go');lstr={'sin(x)','cos(x)'};plot(x,y1,'r')plot(x,y2,'g')=legend(hl,lstr,'location','southwest');%hplot,hlabel在R2013a里可以用~代替set(chleg,'linestyle','-')比较不解的是对chleg里包含的对象分别操作的时候:比如set(chleg(1),'linestyle','.-'),这样的操作用get(chleg(1))来看是正常的,但是图上却没有反应!!!参考:http://www.mathworks.com/matlabcentral/newsreader/view_thread/96754http://www.mathworks.com/matlabcentral/answers/49027还有一个比较巧的方法:http://blog.sciencenet.cn/blog-43412-45936.html8.eps图片在latex中显示不全的问题。表现为eps图片用latex插入,会显示不全,出现在pdf里面看到的图是一部分被截掉的情况。
原因在于eps图片papersize的设置得太小,图片超过了paper的范围。
(笔者也不太明白bounding box和papersize各是什么,在matlab里面还有paperposition设置,这个和bounding box是对应的么?papersize设成A0,但是打印出来的图却是紧凑的,尺寸并不是这个papersize啊!)。
这里给笔者使用命令的解决方案:
set(gcf,'PaperType','A0')
set(gcf,'PaperPositionMode','auto')
print('filename','-depsc');
根据matlab的帮助文件,最好在设置PaperTyper前设置一下PaperUnit。当然PaperSize是可以自己设置的(PaperType给了几个默认设置而已:http://en.wikipedia.org/wiki/Paper_size#C_series)。
set(gcf, 'PaperUnits', 'inches');
set(gcf, 'PaperSize', );
参考:
http://blog.sciencenet.cn/blog-533656-428329.html
http://blog.renren.com/share/236157660/13151799720
http://nibot-lab./73290.htmlhttp://blog.sciencenet.cn/blog-471076-381288.html
http://blog.sina.com.cn/s/blog_618af1950100jipf.html9.坐标轴被遮住、保存后消失set(gca,'Layer','top') %坐标轴被遮set(gca,'LineWidth',2) %保存成png图片后坐标轴消失了,可能是由于坐标轴太细造成的(困扰我许久,比如用patch设置透明后坐标轴消失,用pcolor后坐标轴消失)10. 使用目录下的所有或一类文件files=dir('*.txt');for i=1:length(files)a=load(files(i).name);end注意linux下直接用dir命令会得到所有文件和目录(files.isdir=1),目录中还会含有当前目录“.”和上级目录“..”。自己写的话,linux下可以考虑用system命令结合regexp(str,'\t+\s+','split'),还是挺麻烦,不如直接用dir的方便。11. eps图片使用隐含信息标注因为eps图片开头有一些信息描述文件名、标题、创建者等信息,所以我们可以把一些不需要在图形中显示但是又需要的信息全部放到eps文件隐含的注释信息里面。(这样信息不会轻易随文件名更改而改变。这有没有让你想到基因序列里面的外显子和内含子呢?说不定人类的基因里的内含子还真是创造者植入的注释或者后门呢,哈哈。。。)那么怎么放进去呢?其实eps是基于文本的,把它当文本文档打开就能进行编辑!那么在matlab里的话,怎么做呢?把要写的信息放到一个字符串中,然后在eps文件中替换或添加部分注释信息!目前还不怎么熟悉matlab的字符串替换操作,所以目前我只放一个Linux系统中用系统的sed命令来添加信息的例子:info='Hello, World!';eval_r(['!sed -i ''s/\(\%\%Title.*\)/\%\%',info,'/g'' test.eps'])这样,用图片查看器打开后,查看文档的“属性”时,你就可以看到它的标题这一项变成了“Hello, World!”。12. 生成透明高质量矢量图(未完全测试)12.1 色图里如何把含有NaN的数据设置成白色,并保证输出图的质量。http://www.mathworks.com/matlabcentral/newsreader/view_thread/140607这里面第3个是最好的办法,虽然复杂一点,但是能够保证数据显示正确,而且输出的图体积小质量好。pcolor或set(h,'alphadata',~isnan(C))的方法,都会因为设置了透明而使生成的eps图片即大又质量不好:坐标轴丢失、文字锯齿。12.2 三维图http://www.mathworks.com/matlabcentral/newsreader/view_thread/158841print -depsc2 -painters test3.eps可以解决部分三维图输出质量不高的问题,但是输出有透明数据的图时会有问题?12.3 透明图http://www.myoutsourcedbrain.com/2009/07/produce-print-quality-figures-from.html13 imagesc对nan的处理(有空再考虑完美解决办法)为什么MATLAB不在imagesc中直接默认颜色为白色呢?pcolor是这样的,imagesc却不一样,怎么考虑的?不能理解!13.1 现成可用的m文件,设置成任意颜色:https://gist.github.com/zertrin/555363013.2 最简单的一句(如果你保存成eps图片,可能会发现这是一场悲剧):h=imagesc(C)set(h,'alphadata',~isnan(C))13.3 自己做色标,把nan转化一下:http://www.mathworks.com/matlabcentral/newsreader/view_thread/3374414 数据量比较大时保存真矢量eps图matlab遇到比较大的数据量时,即使想保存为eps矢量图,实际给出来的却是伪矢量图,先当成位图做了一个转换,然后再输出为eps图。这样保存的eps图片,一是质量差,二是其中的文字插入到latex中已经不能编辑了。使用下面的方法保存的不会有问题:print(gca,'-depsc2','painters',filename)参考:http://stackoverflow.com/questions/8280971/matlab-and-high-quality-eps-figures(这里还有一个扩展export_fig文件和savesvg文件,貌似很强大,没有尝试)15. 坐标轴在图形中最大化
tightInset = get(gca, 'TightInset');position(1) = tightInset(1);position(2) = tightInset(2);position(3) = 1 - tightInset(1) - tightInset(3);position(4) = 1 - tightInset(2) - tightInset(4);set(gca, 'Position', position);saveas(h, 'WithoutMargins.pdf');来源地址:http://stackoverflow.com/questions/5150802/how-to-save-a-plot-into-a-pdf-file-without-a-large-margin-around16. eps图嵌入字体export_fig文件很有用,可以解决eps字体嵌入问题:http://btstream.is-programmer.com/posts/24988.html其它解决方案:http://blog.sina.com.cn/s/blog_a3b1929c0100zh5b.html17. 曲面使用一种颜色的巧办法=meshgrid(-8:0.1:8);z=x.^2+y.^2;k=ones(size(z));hsf=surf(x,y,z,k);alpha(hsf,0.5)colormap()shading flat来源:http://www.ilovematlab.cn/thread-54614-1-1.html

页: [1]
查看完整版本: Matlab有用的小工具小技巧