從很早的版本開始MATLAB就支持對(duì) patch、surface 等對(duì)象設(shè)定透明屬性,有些示意圖也必須使用透明的對(duì)象才能充分展示所要表達(dá)的含義。對(duì)透明對(duì)象支持最好的通用圖片格式就是 .png 了,但是 png 圖像并非矢量圖形,對(duì)于一些需要以矢量圖顯示的場(chǎng)合并不適用,比如某些展示超多細(xì)節(jié)的文檔需要不斷被放大放大放大,再比如許多期刊就不允許提交 png 格式的附件,只支持 .eps、.tiff、.jpeg 等。
eps (Encapsulated PostScript) 格式是被學(xué)術(shù)期刊最廣泛認(rèn)可的圖片格式,其本身就是為矢量圖而設(shè)計(jì)。遺憾的是 PostScript 作為一個(gè)啥都能干的圖形學(xué)語音,居然直到現(xiàn)在都不支持透明度(transparency)的屬性,因此想要讓 MATLAB 中的帶透明對(duì)象圖形以 .eps 格式輸出,只能依靠一些偏門的手段來曲線救國,比如下面提到的方案就是把透明對(duì)象的表觀顏色賦給了矢量圖,讓它看起來像是透明而已。
首先明確一下目標(biāo):利用Matlab工具生成帶有透明度屬性(FaceAlpha、EdgeAlpha 等)的圖形,將其以 .eps 格式輸出,且保留 MATLAB 中所展示的透明度特征。先用peaks函數(shù)生成一個(gè)曲面,令其表面透明度為50%:
s = surf(peaks(30))
set(s,'facealpha',0.5);
set(gcf,'color','none');
首先試試用自帶的print函數(shù)導(dǎo)出會(huì)得到怎樣的結(jié)果:
print E:graphic.eps -r300 -opengl
-r300 表示以 300dpi 導(dǎo)出,-opengl 表示使用 opengl渲染器, -painters 渲染器不支持透明屬性所以不用試了。將這張 eps 圖片插入Word中,然后用 Adobe PDF打印機(jī)默認(rèn)的「高質(zhì)量打印」輸出 pdf。
打開 pdf,果然不行,雖然矢量圖保留了,但是連顏色居然都沒了:(
下圖中右邊為局部放大展示,下同。
再來試一下廣受歡迎的export_fig函數(shù):
export_fig E:Graphic2.eps -r300 -a2 -opengl
注意一下export_fig要直接輸出 eps 格式的話需要已經(jīng)安裝GhostScript以及GhostXPS,否則會(huì)報(bào)錯(cuò)。export_fig能保留透明效果(前提是使用 -opengl),但是已經(jīng)變成了位圖,效果如下:
既然export_fig還可以直接輸出為 PDF,不妨試一試 PDF 能不能行得通,然后再用GSView轉(zhuǎn)成 eps:
仍然不對(duì),問題跟直接輸出的 eps 一樣。想要靠 MATLAB 自帶的導(dǎo)出函數(shù)和export_fig基本是沒指望了。我搜了一下,發(fā)現(xiàn)不少人提倡以 .svg (Scalable Vector Graphics) 格式導(dǎo)出矢量圖,但是 .svg 只是網(wǎng)頁常見的矢量圖格式,人家期刊并不支持,還得再繞一步將 .svg 轉(zhuǎn)成 .eps。MATLAB 本身不支持 svg 的導(dǎo)出,所幸 FileExchange 中有人已經(jīng)寫好了plot2svg,使用非常方便。但是需要注意一下的是,plot2svg已經(jīng)三四年沒有更新過了,對(duì)于2014以后版本的 MATLAB 會(huì)報(bào)錯(cuò),只需要進(jìn)入 plot2svg.m 文件中將所有的str2num改為str2double即可。仍然是剛才那個(gè)圖形,將其導(dǎo)出為 svg 格式:
plot2svg('E:Graphic3.svg');
svg 文件當(dāng)然是極好的,又能透明又是矢量,比如下面這張,不管你怎么縮放現(xiàn)在這個(gè)頁面都能保證一直是清晰的
但是我們的目標(biāo)是 eps。我先試了一下免費(fèi)的Inkscape,還是用 300dpi 導(dǎo)出,不選擇柵格化:
可惜導(dǎo)出之后還是變成了位圖(不過貌似使用 Inkscape 導(dǎo)出時(shí)會(huì)自動(dòng)抗鋸齒?對(duì)比下圖和上面export_fig的結(jié)果就會(huì)發(fā)現(xiàn)):
沒辦法只能用 AI 了。我為了把這個(gè)問題解決特意去下載了一個(gè) AI,感覺有些大材小用啊... 還好,問題解決了!AI 導(dǎo)出時(shí)全部使用默認(rèn)設(shè)置,除了把 dpi 調(diào)到300:
導(dǎo)出,真•矢量圖達(dá)成!
繼續(xù)放大:
最后總結(jié)一下工作流:
1、使用plot2svg函數(shù)先將 MATLAB 中生成的圖形以 .svg 格式導(dǎo)出;
2、在Adobe Illustrator中打開 svg 文件,再將其以 .eps 格式導(dǎo)出。
附帶說一下。這個(gè)方法只有必要對(duì) MATLAB 中的帶透明屬性的 patch、edge 對(duì)象進(jìn)行操作,如果僅僅是令當(dāng)前窗口或當(dāng)前坐標(biāo)軸的背景透明,用自帶的print和export_fig都能實(shí)現(xiàn),沒必要搞得那么復(fù)雜。