对于习惯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自带的各种画图函数,还需要调用两个画图助手ghostscriptxpdf,因为这两个是跨平台阅读、编辑矢量图的利器。

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