export high quality figure from matlab
Contents
对于习惯Matlab的科研工作者而言,用它来绘制高质量、可发表的图片还是非常必要的。不过喜欢python的还是坚持去发掘python吧,尤其是matplotlib,自我感觉python画图的风格我更喜欢。一个高清无码,一个复古清新。
Matlab_OSX绘图的bug
1. 导出矢量图出现斜对角灰线
说来可笑,这个bug那就是只有在导出矢量图的时候才会出现,一般来说都是在image
或者surface
等2D绘图,1D曲线图一般不会出问题。bug的原因在于绘制的矢量图被pdf阅读器抗锯齿(走样)机制处理生成新的虚假直线。
mathworks的社区也讨论这个bug很多次了,但是至今还没有看到有人给出一个根本的解决办法。不过庆幸的是windows下面我还没遇到过。
相关的讨论见下:
2. Retina屏下图片显示模糊
额,这个其实是整个matlab对retina的兼容性问题,不过庆幸的是matlab2016b已经解决了这个bug。
3. tif格式不清晰
应该说,想保存高质量的矢量图可以选择,eps
,pdf
,tif
。不过偶尔,这个偶尔有时候也非常讨人厌,tif
格式保存的图片并不能伸缩。
4. emf格式
mac下面是不能导出emf
格式,但是windows可以。不过mac下面一样的支持,在Figure>>Edit>>
可以通过copy figure来考虑矢量图直接粘贴到word
中去。可不幸的是,如此的拷贝偶尔一样会出问题,暂时已经想不清了,以后慢慢补上。
export_fig
认识export_fig这个工具箱是mathworks上不小心撞见的,可这个发现真的让我暂时性认为找到了matlab画图的最终利器。
Yair Altman’s export_fig
export_fig是Altman的杰作,Github上时刻在更新,有问题也可直接提交。可以说,你看在windows上看到的是什么保存下来的就是什么。是个,这个窗口不仅仅是画图窗口,还是windows,Mac的对角虚线的bug还是不能解决。 这个工具箱有以下我认为重要的功能:
- 1.支持导出多种矢量图、位图(eps,pdf,tif,png)
- 2.支持自动裁剪figure多余边框
- 3.支持透明背景
- 4.支持不同分辨率矢量图的导出
- 5.支持灰图、彩色图等不同色域保存
- 6.支持在线更新
1. export_fig的安装
这个工具箱的牛逼不仅仅在于利用了matlab自带的各种画图函数,还需要调用两个画图助手ghostscript和xpdf,因为这两个是跨平台阅读、编辑矢量图的利器。
2. ghostscript
对于MAC而言,export_fig会先从/usr/bin/gs
和/usr/local/bin/gs
这两个路径下寻找ghostscript的可执行二进制文件,如果这两个路径都没有的话,工具箱会从matlab能直接调用的SHELL PATH
中搜索,再找不到就会报错。
如果在安装工具箱之前已经把gs安装到别的位置,那就给matlab的SHELL PATH
添加gs的安装路径即可。添加路径类似于bash添加环境变量,只不过修改的文件不同。
关于这点网上不同人说法不一,我自己的方法是修改/Applications/MATLAB_R2016b.app/bin/matlab
,添加export PATH=$PATH:/path1/path2/path3/
。
这一部分可以参考社区里的讨论$PATH in bash shell。路径添加成功可以在matlab的命令窗口输入>> unix(echo $PATH)
来确认。
对于Windows而言,export_fig会先从C:\Program Files\gs\
或者C:\Program Files (x86)\gs\
中寻找gs,如果还没有找到,那就会搜寻CMD PATH
,再找不到也会报错。避免问题复杂化,你还是把文件放在那两个默认位置吧。
同理,想要matlab调用别的unix
或者cmd
程序也是一样的要添加路径,不过windows的不一样。
当然,你也可以自行修改工具箱中的`ghostscript.m`文件中gs_path function
。
% Check whether the binary is on the path
if ispc
bin = {'gswin32c.exe', 'gswin64c.exe', 'gs'};
else
bin = {'gs'};
end
for a = 1:numel(bin)
path_ = bin{a};
if check_store_gs_path(path_)
return
end
end
% Search the obvious places
if ispc
default_location = 'C:\Program Files\gs\';
dir_list = dir(default_location);
if isempty(dir_list)
default_location = 'C:\Program Files (x86)\gs\'; % Possible location on 64-bit systems
dir_list = dir(default_location);
end
executable = {'\bin\gswin32c.exe', '\bin\gswin64c.exe'};
ver_num = 0;
% If there are multiple versions, use the newest
for a = 1:numel(dir_list)
ver_num2 = sscanf(dir_list(a).name, 'gs%g');
if ~isempty(ver_num2) && ver_num2 > ver_num
for b = 1:numel(executable)
path2 = [default_location dir_list(a).name executable{b}];
if exist(path2, 'file') == 2
path_ = path2;
ver_num = ver_num2;
end
end
end
end
if check_store_gs_path(path_)
return
end
else
executable = {'/usr/bin/gs', '/usr/local/bin/gs'};
for a = 1:numel(executable)
path_ = executable{a};
if check_store_gs_path(path_)
return
end
end
end
3. xpdf文件
在此,我想说类似gs,xpdf要放在C:\Program Files\xpdf\
或者`C:\Program Files (x86)\xpdf\`或者/usr/bin/pdftops
或者 /usr/local/bin/pdftops
。
这里需要说一下,xpdf和gs一样,不管是win还是mac下面都是一些二进制文件,.exe
或者无后缀,这些可执行文件放在该放的位置调用他的程序就不会出错。
否则,你就去修改调用程序吧,xpdf是一系列pdf文件转换程序,以pdftops为例修改pdftops.m
文件中的xpdf_path function
。
if ispc
bin = 'pdftops.exe';
else
bin = 'pdftops';
end
if check_store_xpdf_path(bin)
path_ = bin;
return
end
% Search the obvious places
if ispc
paths = {'C:\Program Files\xpdf\pdftops.exe', 'C:\Program Files (x86)\xpdf\pdftops.exe'};
else
paths = {'/usr/bin/pdftops', '/usr/local/bin/pdftops'};
end
Author F. Cheng
LastMod 2016-10-14