從很早的版本開(kāi)始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é)語(yǔ)音,居然直到現(xiàn)在都不支持透明度(transparency)的屬性,因此想要讓 MATLAB 中的帶透明對(duì)象圖形以 .eps 格式輸出,只能依靠一些偏門(mén)的手段來(lái)曲線救國(guó),比如下面提到的方案就是把透明對(duì)象的表觀顏色賦給了矢量圖,讓它看起來(lái)像是透明而已。
首先明確一下目標(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。
打開(kāi) pdf,果然不行,雖然矢量圖保留了,但是連顏色居然都沒(méi)了:(
下圖中右邊為局部放大展示,下同。


再來(lái)試一下廣受歡迎的 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ì),問(wèn)題跟直接輸出的 eps 一樣。想要靠 MATLAB 自帶的導(dǎo)出函數(shù)和 export_fig 基本是沒(méi)指望了。我搜了一下,發(fā)現(xiàn)不少人提倡以 .svg (Scalable Vector Graphics) 格式導(dǎo)出矢量圖,但是 .svg 只是網(wǎng)頁(yè)常見(jiàn)的矢量圖格式,人家期刊并不支持,還得再繞一步將 .svg 轉(zhuǎn)成 .eps。MATLAB 本身不支持 svg 的導(dǎo)出,所幸 FileExchange 中有人已經(jīng)寫(xiě)好了 plot2svg,使用非常方便。但是需要注意一下的是,plot2svg 已經(jīng)三四年沒(méi)有更新過(guò)了,對(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è)頁(yè)面都能保證一直是清晰的
但是我們的目標(biāo)是%20eps。我先試了一下免費(fèi)的 Inkscape,還是用%20300dpi%20導(dǎo)出,不選擇柵格化:
可惜導(dǎo)出之后還是變成了位圖(不過(guò)貌似使用 Inkscape 導(dǎo)出時(shí)會(huì)自動(dòng)抗鋸齒?對(duì)比下圖和上面 export_fig 的結(jié)果就會(huì)發(fā)現(xiàn)):


沒(méi)辦法只能用 AI 了。我為了把這個(gè)問(wèn)題解決特意去下載了一個(gè) AI,感覺(jué)有些大材小用啊... 還好,問(wèn)題解決了!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 中打開(kāi) svg 文件,再將其以 .eps 格式導(dǎo)出。
附帶說(shuō)一下,本文轉(zhuǎn)載自:https://capbone.com/use-matlab-to-export-vector-graphics-with-transparent-features/。這個(gè)方法只有必要對(duì) MATLAB 中的帶透明屬性的 patch、edge 對(duì)象進(jìn)行操作,如果僅僅是令當(dāng)前窗口或當(dāng)前坐標(biāo)軸的背景透明,用自帶的 print 和 export_fig 都能實(shí)現(xiàn),沒(méi)必要搞得那么復(fù)雜。
新聞熱點(diǎn)
疑難解答
圖片精選