许可优化
许可优化
产品
产品
解决方案
解决方案
服务支持
服务支持
关于
关于
软件库
当前位置:服务支持 >  软件文章 >  Matlab制作小工具:实用技巧与代码示例

Matlab制作小工具:实用技巧与代码示例

阅读数 5
点赞 0
article_banner

转载地址:http://blog.sina.com.cn/s/blog_59cf672601015qmm.html

目录:

1.使图形窗口的默认text解释器为latex

2.图形窗口最大化

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. 坐标轴在图形中最大化

1.使当前图形窗口的默认text解释器为latex:

set(gcf,’DefaultTextInterpreter’,’latex’)

同理可推广:

set(0,’DefaultTextInterpreter’,’latex’)

但是legend的解释器似乎不受这个设置影响?(可以用’Interpreter’,’latex’来设置,但是感觉还是不爽。)

2.使图形窗口最大化:

set(gcf,’outerposition’,get(0,’screensize’))

3.双坐标

[hax,hl1,hl2]=plotyy([x1,y1,x2,y2],[x3,y3]);

这将在左边的坐标轴里画两条曲线(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);

局部放大子图

有一个mmzoom的扩展,可以用鼠标选区域来放大,用起来也挺好,不过不利于精确控制。

其实,要自己画子图也不难:

myzoom([0.18,0.18,0.4,0.3],[x0,x1,y0,y1])

通过笔者自己写的简单函数来实现放大:

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是字图在当前图中的相对位置和大小,[x0,x1,y0,y1]是你要放大的坐标范围。

Figure缩放字体问题

让字体随figure的比例随你设置的缩放比例而变:

hf=figure;

fp=get(hf,’position’);

times=2.0; %自定义缩放倍数,

set(hf,’position’,[0 0 times*fp(3:4)]) %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(findobj(‘FontSize’,10),’FontSize’,figure_FontSize);可以把所有的对象中字体大小为10的都改到想要的号啊!

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);

figure

hold on

box on

n=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’)

[hleg chleg hplot hlabel]=legend(hl,lstr,’location’,’southwest’);%hplot,hlabel在R2013a里可以用~代替

set(chleg,’linestyle’,’-‘)

比较不解的是对chleg里包含的对象分别操作的时候:比如set(chleg(1),’linestyle’,’.-‘),这样的操作用get(chleg(1))来看是正常的,但是图上却没有反应!!!

8.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(‘vtth_vt_vc_59_p’,’-depsc’);

根据matlab的帮助文件,最好在设置PaperTyper前设置一下PaperUnit。当然PaperSize是可以自己设置的(PaperType给了几个默认设置而已:http://en.wikipedia.org/wiki/Paper_size#C_series)。

set(gcf, ‘PaperUnits’, ‘inches’);

set(gcf, ‘PaperSize’, [5 7]);

参考:

http://blog.sciencenet.cn/blog-533656-428329.html

http://blog.renren.com/share/236157660/13151799720

http://nibot-lab./73290.html

9.坐标轴被遮住、保存后消失

set(gca,’Layer’,’top’) %坐标轴被遮

set(gca,’LineWidth’,2) %保存成png图片后坐标轴消失了,可能是由于坐标轴太细造成的(困扰我许久,比如用patch设置透明后坐标轴消失,用pcolor后坐标轴消失)

使用目录下的所有或一类文件

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的方便。

[原创]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.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/158841

print -depsc2 -painters test3.eps可以解决部分三维图输出质量不高的问题,但是输出有透明数据的图时会有问题?

13 imagesc对nan的处理(有空再考虑完美解决办法)

为什么MATLAB不在imagesc中直接默认颜色为白色呢?

pcolor是这样的,imagesc却不一样,怎么考虑的?不能理解!

13.2 最简单的一句(如果你保存成eps图片,可能会发现这是一场悲剧):

h=imagesc(C)

set(h,’alphadata’,~isnan(C))

14 数据量比较大时保存真矢量eps图

matlab遇到比较大的数据量时,即使想保存为eps矢量图,实际给出来的却是伪矢量图,先当成位图做了一个转换,然后再输出为eps图。这样保存的eps图片,一是质量差,二是其中的文字插入到latex中已经不能编辑了。

使用下面的方法保存的不会有问题:

print(gca,’-depsc2’,’painters’,filename)

参考:http://www.voidcn.com/article/p-fzeoutiq-btq.html

(这里还有一个扩展export_fig文件和savesvg文件,貌似很强大,没有尝试)

坐标轴在图形中最大化

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://www.voidcn.com/article/p-uzlcdcac-bsq.html


免责声明:本文系网络转载或改编,未找到原创作者,版权归原作者所有。如涉及版权,请联系删

相关文章
技术文档
QR Code
微信扫一扫,欢迎咨询~
customer

online

联系我们
武汉格发信息技术有限公司
湖北省武汉市经开区科技园西路6号103孵化器
电话:155-2731-8020 座机:027-59821821
邮件:tanzw@gofarlic.com
Copyright © 2023 Gofarsoft Co.,Ltd. 保留所有权利
遇到许可问题?该如何解决!?
评估许可证实际采购量? 
不清楚软件许可证使用数据? 
收到软件厂商律师函!?  
想要少购买点许可证,节省费用? 
收到软件厂商侵权通告!?  
有正版license,但许可证不够用,需要新购? 
联系方式 board-phone 155-2731-8020
close1
预留信息,一起解决您的问题
* 姓名:
* 手机:

* 公司名称:

姓名不为空

姓名不为空

姓名不为空
手机不正确

手机不正确

手机不正确
公司不为空

公司不为空

公司不为空