MATLAB怎么生成带透明对象的矢量图

从很早的版本开始MATLAB就支持对 patch、surface 等对象设定透明属性,有些示意图也必须使用透明的对象才能充分展示所要表达的含义 。对透明对象支持最好的通用图片格式就是 .png 了,但是 png 图像并非矢量图形,对于一些需要以矢量图显示的场合并不适用,比如某些展示超多细节的文档需要不断被放大放大放大,再比如许多期刊就不允许提交 png 格式的附件,只支持 .eps、.tiff、.jpeg 等 。

MATLAB怎么生成带透明对象的矢量图


eps (Encapsulated PostScript) 格式是被学术期刊最广泛认可的图片格式,其本身就是为矢量图而设计 。遗憾的是 PostScript 作为一个啥都能干的图形学语音,居然直到现在都不支持透明度(transparency)的属性,因此想要让 MATLAB 中的带透明对象图形以 .eps 格式输出,只能依靠一些偏门的手段来曲线救国,比如下面提到的方案就是把透明对象的表观颜色赋给了矢量图,让它看起来像是透明而已 。
首先明确一下目标:利用 MATLAB 生成带有透明度属性(FaceAlpha、EdgeAlpha 等)的图形,将其以 .eps 格式输出,且保留 MATLAB 中所展示的透明度特征 。先用peaks函数生成一个曲面,令其表面透明度为50%:
s = surf(peaks(30))
set(s,\'facealpha\',0.5);
set(gcf,\'color\',\'none\');
MATLAB怎么生成带透明对象的矢量图


首先试试用自带的print函数导出会得到怎样的结果:
print E:graphic.eps -r300 -opengl
-r300 表示以 300dpi 导出,-opengl 表示使用 opengl 渲染器, -painters 渲染器不支持透明属性所以不用试了 。将这张 eps 图片插入 Word 中,然后用 Adobe PDF 打印机默认的「高质量打印」输出 pdf 。
打开 pdf,果然不行,虽然矢量图保留了,但是连颜色居然都没了:(
下图中右边为局部放大展示,下同 。
MATLAB怎么生成带透明对象的矢量图


MATLAB怎么生成带透明对象的矢量图


再来试一下广受欢迎的export_fig函数:
export_fig E:Graphic2.eps -r300 -a2 -opengl
注意一下export_fig要直接输出 eps 格式的话需要已经安装GhostScript以及GhostXPS,否则会报错 。export_fig能保留透明效果(前提是使用 -opengl),但是已经变成了位图,效果如下:
MATLAB怎么生成带透明对象的矢量图


MATLAB怎么生成带透明对象的矢量图


既然export_fig还可以直接输出为 PDF,不妨试一试 PDF 能不能行得通,然后再用GSView转成 eps:
MATLAB怎么生成带透明对象的矢量图


MATLAB怎么生成带透明对象的矢量图


仍然不对,问题跟直接输出的 eps 一样 。想要靠 MATLAB 自带的导出函数和export_fig基本是没指望了 。我搜了一下,发现不少人提倡以 .svg (Scalable Vector Graphics) 格式导出矢量图,但是 .svg 只是网页常见的矢量图格式,人家期刊并不支持,还得再绕一步将 .svg 转成 .eps 。MATLAB 本身不支持 svg 的导出,所幸 FileExchange 中有人已经写好了plot2svg,使用非常方便 。但是需要注意一下的是,plot2svg已经三四年没有更新过了,对于2014以后版本的 MATLAB 会报错,只需要进入 plot2svg.m 文件中将所有的str2num改为str2double即可 。仍然是刚才那个图形,将其导出为 svg 格式:
plot2svg(\'E:Graphic3.svg\');
svg 文件当然是极好的,又能透明又是矢量,比如下面这张,不管你怎么缩放现在这个页面都能保证一直是清晰的

推荐阅读