怎樣將 MATLAB 畫出的圖形輸出為矢量圖?

題主簡直要被這個問題折磨崩潰了……試了七八種方法,成功過一個方法,但不知為何過一段時間成功的方法又不行了。目前嘗試的方法如下:

1.在圖形編輯器中另存為為eps

結果:坐標軸字體強制變為另一種很醜的字體,且擠在一起

2.在圖形編輯器中另存為pdf

結果:同上

3.使用"複製圖形",將圖形複製到visio/word後轉pdf,用Adobe裁剪保存為eps

結果:成功,但過兩周後複製的圖形竟然不再像先前那樣是矢量圖了!居然也有失真!在複製選項中嘗試了各種組合都未能還原。

4.使用列印預覽列印

結果,由於圖形太大(實在是沒有辦法,必須那麼大),圖形被裁切;調整大小為最優後,圖例卻沒有相應縮放,遮擋住了圖形;

所以,對於這樣一個奇葩的圖而言,怎樣成功地將其輸出為矢量圖呢?


題主可能對MATLAB面向對象式繪圖不了解。我在此舉個例子,拋磚引玉。

% 創建figure對象
Fig = figure(...
Units, pixels,...
Name, move2,...
NumberTitle, off,...
IntegerHandle, off);
% 創建axes對象, 設定坐標軸屬性
AxesH = axes(...
Parent, Fig,...
Xlim, [-10 50],...
Ylim, [-10 40],...
XGrid, on,...
YGrid, on,...
DataAspectRatio, [1 1 1],...
Visible, on);

t = linspace(0,45,101)*pi/180;
x = 40*cos(t);
y = 40*sin(t);
realtrace = line(AxesH, x, y,linewidth,2);
precisetrace = line(AxesH,[x(1) x(end)] ,[y(1) y(end)],...
color,g,...
linewidth,2,...
linestyle,--);

legend(AxesH,[realtrace,precisetrace],...
真實運動軌跡,精確運動軌跡,...
location,northwest);
% 指定保存路徑和格式
saveas(Fig,[D:abc Fig.Name],pdf)

就題主的問題而言,創建新圖後,保存其句柄為Fig,然後

saveas(Fig,[D:abc Fig.Name],pdf)

就搞定了。

至於其他如圖形大小、坐標軸字體等問題,應在創建對象時立即設定。

手動編輯MATLAB的圖形不容易得到好的效果。

更新:

所謂面向對象式的繪圖,是仿照生活實際而來的,有別於過程式的繪圖方式。

  1. 創建figure對象。攤開空白畫布
  2. 創建axes對象。畫布上選一個繪製區域
  3. 創建line對象。在繪圖區畫線
  4. 創建legend對象。在繪圖區標註
  5. saveas,保存圖像

各種對象都有不同的屬性,繪製精緻的圖形本質上是學會設置各種屬性


樓上的已經回答的很好了 @ph ren,我補充一下。

f = figure;
P1 = plot(x, y, -, lineWidth, 1.2, color, [0.8 0.3 0.5]);
hold on;
P2 = plot(x, y2, -, lineWidth, 1.2, color, [0.1 0.3 0.5]);

axis([xmin xmax ymin ymax]) % x y軸範圍 1pt = 1/72inch 1 inch = 25.4mm
xlabel(Torque $M_x$ (Nm),interpreter,latex,FontSize,8); % Latex格式的label
ylabel(Contact force (N),Fontname, Times New Roman,FontSize,8);

width = 240; % 240pt US letter 雙欄
set(gcf,unit,points,PaperUnits,points,PaperPosition,[0,0,240,240/5*4],...
position,[500 300 240 240/5*4],color,w,PaperSize,[width, width/5*4]);
set(gca, Fontname, Times New Roman, Fontsize, 8); % 坐標軸句柄,設置坐標軸刻度數字樣式
L1 = legend([P1 P2],Actual torque,Fake);
set(L1,Location,northeast,Orientation,vertical,...
Fontname, Times New Roman,FontSize,8,TextColor,black);% legend 格式
%輸出圖形到文件
print(Figure1,-dpdf,-r300); %輸出pdf,簡單線圖用pdf或eps(-deps),AI打開編輯
print(Figure2,-djpeg,-r600); %輸出jpg, 複雜、數據量大的彩圖用jpg,600ppi

針對題主的問題給幾點建議:

  • 不推薦用Figure窗口自帶的「文件-另存為-」(我就沒成功過)
  • 同樣不推薦用Figure窗口「編輯-複製」到visio/AI(除非你只是想複製到PPT等簡單的場合),請print為pdf/eps文件,用AI打開。採用「編輯-複製」,即便是你設置了矢量圖,無法完全的把數據複製過去(figure數據量大的情況下,複製出來的圖跟原圖不一樣,有時會自動變為點陣圖)
  • 請提前設置好繪圖的大小(基於你論文排版需要),所有字體樣式,不要用滑鼠拖動Figure窗口大小(除非你只是想簡單的使用),上面的代碼寫的是US letter下雙欄排版的圖 width = 240
  • 想輸出pdf/eps/jpg,用上述的print輸出,然後用AI打開文件編輯修改,用AI導出為/存儲為...
  • 將visio/word文檔轉換為pdf,請使用Acrobat PDFMaker,不推薦用其自帶的另存為或列印為pdf(存在很多細節問題)


export_fig 了解一下

官網file exchange就有


print -depsc figurename.eps


如果要用到word里的話導出為emf格式,轉換為pdf也是可以放大的,emf是增強型windows文件。


推薦閱讀:

matlab計算積分無解?
MATLAB曲線擬合工具箱
MATLAB 高級數據結構連載 6:使用containers.Map實時監控股票行情(2)
如何通過時域的輸入輸出波形,求出系統的傳遞函數?
Matlab繪圖(學習筆記摘抄)

TAG:圖像處理 | MATLAB | 矢量圖 |