1. 程式人生 > >畫圖技巧 : Matlab呼叫Origin作圖

畫圖技巧 : Matlab呼叫Origin作圖

轉載畫圖技巧 matlab 呼叫 Origin

Matlab作出的圖普遍沒有Origin作出的美觀好看,而且匯出為eps或emf格式後會有各種奇怪的Bug。目前普遍採用的一種方法是,將Matlab資料匯出為mat檔案後再匯入Origin中手工作圖,這種方式需要不少重複性勞動,並不是一種很完美的解決方案。
前幾天偶然看到Origin提供了COM介面可供Matlab呼叫,於是就研究了下可否用Matlab呼叫Origin來生成所需的emf格式圖片,最終經過一番折騰,基本完成了這個目標。

之所以能用Matlab來呼叫Origin,這要依賴於Origin中提供的Automation Server

服務。這個服務提供了一個COM介面來供其他程式呼叫,官方提供了Matlab、VB、Excel、C#、LabVIEW等諸多程式呼叫Origin的例子。Automation Server的詳細使用方法可參考其官方幫助文件

Matlab呼叫Origin的示例程式位於<Install Path>\Samples\COM Server and Client\MATLAB路徑下(以Origin 2015為例,其他版本的位置可能有所不同)。一共有兩個m檔案,CreatePlotInOrigin.mMATLABCallOrigin.m,前者用於實現呼叫Origin繪圖,並將結果儲存到剪貼簿中,後者演示瞭如何建立工作表(Worksheet),如何插入新列等操作。另外一個CreatePlotInOrigin.opj

檔案是供CreatePlotInOrigin.m呼叫的一個Origin模板檔案。

根據這兩個示例程式基本就可以依葫蘆畫瓢寫出一個符合自己要求的程式了,然而這其中並沒有匯出emf格式圖片的示例,於是開始研究其官方幫助文件……官方幫助文件很多地方都語焉不詳,而且其間還經歷了種種坑,比如上篇文章這個。不過最終還是找到了正確的解決辦法,就是使用Origin X-Function中的expGraph命令。


最終找到的較好的解決方案是這樣的:

首先,用Origin生成一個空白模板工程,其中包含了基本的Worksheet結構及Graph樣式,比如示例檔案中提供的這個:

這個模板工程需要保證只要向Worksheet中填入資料,Graph中就能生成所需的圖,就像這樣:

這裡的Worksheet和Graph可以不止有一個,不過一般情況下一個就足夠了。

製作好了模板檔案後,在Matlab程式中只需要通過COM介面呼叫Origin,開啟這個模板檔案,然後向其中的Worksheet填入正確的資料,最後匯出圖片檔案即可。
Matlab程式如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
% 呼叫Origin作圖並儲存為emf格式的圖片
% 作者 : 高明飛
% 日期 : 2016-01-27

% mdata : 需要填充到Origin Worksheet中的資料
% template : Origin模板函式名,不含字尾,需要儲存在當前工作目錄下,如'CreatePlotInOrigin'
% fdir : 輸出圖片目標資料夾,如'D:\image'
% fname : 輸出圖片檔名,不含字尾,如'abc'

function OriginPlot(mdata, template, fdir, fname)
% Obtain Origin COM Server object
% This will connect to an existing instance of Origin, or create a new one if none exist
originObj=actxserver('Origin.ApplicationSI');

% Clear "dirty" flag in Origin to suppress prompt for saving current project
invoke(originObj, 'IsModified', 'false');

% Load the custom template project
dir = pwd;
dir = strcat(dir, '\', template, '.opj');
invoke(originObj, 'Load', dir);

% Send this data over to the Data1 worksheet
invoke(originObj, 'PutWorksheet', 'Data1', mdata);

% Save graph
cmd = 'expGraph type:=emf overwrite := rename tr1.unit := 2 tr1.width := 10000 path:= "';
cmd = strcat(cmd, fdir, '" filename:= "', fname, '.emf";');
invoke(originObj, 'Execute', cmd);

% Release
release(originObj);
end

上面這段程式中要求Worksheet的名稱需要為Data1,這是由invoke(originObj, 'PutWorksheet', 'Data1', mdata);這句程式碼確定的;
匯出的圖片為emf格式,影象寬度為10000畫素,因為這是向量圖,所以檔案體積並不大的。

以上這個版本只是個最基本的版本,不過一般使用也夠用了,更多的高階功能,比如動態調整座標軸名稱,動態調整x、y軸的範圍以適應不同資料等之後有空再來研究……

原始連結:http://gaomf.cn/2016/01/28/Matlab呼叫Origin作圖/