LabTalkによるグラフ作成とエクスポート

 

概要

LabTalkには、2Dまたは3Dグラフを作成および編集し、それらを画像または動画ファイルとしてエクスポートするために使用できる、多くのコマンド、オブジェクト、およびXファンクションがあります。

学習する項目

このチュートリアルでは、LabTalk スクリプトを使用して次のことを行う方法を説明します。

  • 2Dグラフの作成
  • 3Dグラフの作成
  • グラフの軸とデータ プロットの編集
  • グラフを画像ファイルとしてエクスポート
  • 複数のグラフの組み合わせを動画としてエクスポート

スクリプトは各サンプル内で順番に実行されるように設計されています。

ステップ

グラフを作成する

2Dグラフ

  1. 以下のスクリプトを実行して、Graph2Dという新しいワークブックを作成し、インポートフィルターwaterfall.oifを使って<Origin EXE Folder>\Samples\Graphing\のWaterfall.datファイルをインポートします。この場合、XファンクションImpFileが使用されます。
  2. // 新規ブックを作成し、Graph2Dと名前付け(ロングネームとショートネーム両方)
    newbook name:="Graph2D" option:=lsname;
    // ファイル名とフィルタ名を定義
    string fname$ = system.path.program$ + "Samples\Graphing\Waterfall.dat";
    string filtername$ = "waterfall.oif";  
    // Xファンクションimpfileを使用して、インポートフィルタで指定ファイルをインポート
    impfile fname:=fname$ filtername:=filtername$ location:=data orng:=[Graph2D]1!;
    
  3. Xファンクションplotxyを使用して、ワークブックGraph2Dにインポートされたデータの1 列目をXとし、2列目をYとして、線とシンボルのグラフを作成します。
  4. // ユーザ定義のRGBカラーで線とシンボルのXYプロットを作成
    plotxy iy:=[Graph2D]1!(1,2) plot:=202 color:=color(255,0,255);
    // 文字列レジスタを使用して、作成したグラフのショートネームを取得
    %A = %H;
    
  5. 作成したグラフに別のデータプロットを追加します。ここではプロット先のレイヤを指定します。
  6. plotxy iy:=[Graph2D]1!(1,126) plot:=202 ogl:=[%A]1!;
    
  7. 組み込みテンプレートdoubleYを使用して別のグラフを作成します。
  8. // ソースデータワークシートの範囲を定義
    range rr = [Graph2D]1!;
    // 組み込みテンプレート '''doubleY'''を使用し、1列目をX、2列目をYとしてグラフの最初の (アクティブな) レイヤに線 + シンボルグラフをプロット
    plotxy iy:=%(rr)(1,2) plot:=202 ogl:=[<new template:=doubleY>];
    // グラフの2番目のレイヤに折れ線グラフを追加。1列目をX、126列目をYに設定
    plotxy iy:=%(rr)(1,126) plot:=200 ogl:=2!;
    //新しいグラフの名前を取得し、文字列変数 str1に保存
    string str1$ = page.name$;
    

3Dグラフ

  1. 次のスクリプトを使用して、<Origin EXE>\Samples\Matrix Conversion and Gridding\にあるファイルXYZ Random Gaussian.datをインポートします。
  2. // 新しいワークブックを作成
    newbook;
    // ファイル名を指定
    string str2$ = "Samples\Matrix Conversion and Gridding\XYZ Random Gaussian.dat";
    // ファイルパを含める
    string fname$ = system.path.program$ + str2$;
    // XファンクションimpASCでインポート
    impASC fname:=fname$;
    //文字列レジスタを使用してワークブック名​​を取得
    %B = %H;
    
  3. wks.colオブジェクトを使用して、3番目の列をZ列に設定します。
  4. // 保存された文字列レジスタ変数を使って3番目の列をZに設定
    %B!wks.col3.type = 6;
    
  5. Xファンクションplotxyzで3Dカラーマップ曲面グラフを作成します。
  6. // データワークシートをアクティブにする
    win -a %B;
    // 選択したワークシートデータから3Dカラーマップ曲面グラフを作成
    plotxyz iz:=3 plot:=103 ogl:=<new template:=glcmap>;
    //グラフウィンドウ名を文字列変数str3に保存
    string str3$ = page.name$;
    

Note: worksheet -pコマンドを使用して2Dグラフと3Dグラフの両方を作成できますが、先にworksheet -sコマンドを使用して目的の入力データ範囲を選択する必要があります。

グラフを編集する

グラフウィンドウは、Pageオブジェクトに結びついたビジュアルページで構成されます。各グラフページには、少なくとも1つのビジュアルレイヤと、関連付けられたlayerオブジェクトが含まれます。グラフレイヤには、layerオブジェクトのサブオブジェクトであるlayer.xおよびlayer.yオブジェクトが関連付けられた一連のXY軸が含まれています。これらのオブジェクトへのLabTalkアクセスにより、ページ、レイヤ、軸のプロパティを制御できます。

データプロットを編集する場合、setコマンドを使用できます。グラフ上のテキストオブジェクトを編集場合には、 labelコマンドが役立ちます。

さらに、グラフを操作するためXファンクションも用意されています。

前セクションのプロジェクトファイルを引き続き使用していきます。

  1. 次のスクリプトを実行して、作成した最初のグラフの軸タイプを設定します。
    //グラフ ウィンドウをアクティブにする
    win -a %A;
    //Y軸のタイプをlog10に変更し、開始値0.003に変更
    layer.y.type = 2;
    layer.y.from = .003;
    //Y軸のタイトルを"Amplitude"に変更
    label -yl Amplitude;
    // X軸とY軸の右側のレイヤを表示
    layer.x.showAxes = 3;
    layer.y.showAxes = 3;
    //X軸の主グリッドを破線で表示
    layer.x.showGrids = 1;
    layer.x.grid.majorType = 2;
    
  2. 次に、setコマンドを使用して2番目のデータプロットを編集します。
  3. //最初に作成したグラフウィンドウがアクティブであることを確認
    //既にアクティブになっている場合は、次の行の実行は不要
    win -a %A;
    //2番目のデータプロットをアクティブにする
    layer.plot = 2;
    //シンボルの形状をCross(X)に設定
    set %C -k 7;
    //プロット線の色を青に設定
    set %C -cl 4;
    //シンボルの境界色をオリーブに設定
    set %C -cse 12;
    
  4. 以下スクリプトを実行して、二重Y軸グラフを編集します。
  5. //二重Y軸グラフのレイヤ2にある第一データプロットの範囲を宣言
    range r2 = [%(str1$)]2!1;
    //線を破線に設定
    set r2 -d 1;
    //二重Y軸グラフのウィンドウをアクティブにして、変化を表示
    win -a %(str1$);
    
  6. Xファンクションlegendupdate を使用して、二重Y軸グラフの凡例を更新します。
  7. //元データのワークシート範囲を事前定義
    range rw=[Graph2D]1!;
    //最初に作成したグラフウィンドウがアクティブであることを確認
    //既にアクティブになっている場合は、次の行の実行は不要
    win -a %(str1$);
    //Xファンクションlegendupdateで凡例を更新
    //凡例は最初のユーザ定義パラメータの名前 + 値
    //@LD1 は最初のユーザ定義パラメーター
    legendupdate mode:=7 custom:="%(rw.UserParam1$)-@LD1";
    
  8. layer -3d r コマンドで3Dグラフを回転します。
  9. //先ほど作成した3Dプロットのグラフウィンドウをアクティブに
    win -a %(str3$);
    //垂直方向に90度回転
    layer -3d r V 90;
    //リフレッシュしてグラフ表示を確認
    doc -uw;
    

グラフエクスポート

画像としてエクスポート

XファンクションexpGraphを呼び出して、1つまたは複数のグラフを画像ファイルにエクスポートできます。画像ののエクスポート設定を制御するには、tr1またはtr2ツリーを使用できます。

  • 次のスクリプトを使用して、現在のプロジェクトのすべてのグラフをイメージとしてユーザファイルフォルダ (%Y 文字列レジスタに保存されているパス) にエクスポートし、幅を600ピクセル、DPI解像度を100、圧縮方式をLZWに設定します。エクスポートされたファイル名は、グラフウィンドウのロングネームとシステム日時の組み合わせで設定されます。
  • doc -e P
    {
    expGraph type:=pdf filename:="<long name>-$(System.Date(),D11)" path:=%Y
         tr.Margin:=2 
         tr1.Unit:=2 
         tr1.Width:=600 
         tr2.TIF.DotsPerInch:=100
         tr2.TIF.Compression:=LZW;
    }
    

スクリプトの記述を簡素化するには、 expGraphダイアログ (ファイル:グラフエクスポート)を開き、ダイアログの設定を変更して、ダイアログテーマの横にある三角形のボタンをクリックし、スクリプトの生成を選択して、同じ設定でLabTalkスクリプトを生成します。

動画のエクスポート

vwオブジェクトを使用して、グラフを動画としてエクスポートできます。

  • 以下のスクリプトを実行して励起波長の増加に伴うスペクトル形状の変化を示す動画をエクスポートします。Graph2D ワークブックのデータを使用します。
  • // MPEG4の圧縮方式を定義
    int codec = vw.FourCC('F','M','P','4'); 
    //この圧縮方法がサポートされているかどうかを確認
    //サポートされていない場合、圧縮は使用されない
    if(vw.IsCodecInstalled(codec) == 0) 
    codec = 0; 
     
    //動画ファイル名を''<User Files Folder>\test.avi''で定義
    //文字列レジスタ %Z を使用して、ファイル パスと名前を保存
    %Z = %Ytest.avi;
    // ビデオ ライターを作成(fileName, codec, framesPerSec, width, height)
    int err = vw.Create(%Z, codec, 8, 1024, 768);
    if( 0 == err )
    {
           //ソースデータワークシートの範囲を定義
            win -a Graph2D;
            range rw1 = [Graph2D]1!;
           //最初のグラフを作成
            plotxy iy:=%(rw1)2 plot:=200;
           //Y軸のスケールと増分を編集
            layer.y.to = 3250;
            layer.y.inc = 500;
            //凡例を更新
            legendupdate mode:=7 custom:="%(rw1.UserParam1$)-@LD1";
            // 凡例を配置
            legend.y = layer.y.to;
            legend.x = layer.x.to - legend.dx / 2;
            //ループを使用して、グラフ内のプロットデータを置き換え
            //各グラフをビデオのフレームとして追加 
            for(int a=3; a<=rw1.nCols; a++)
            {
                   //現在表示されているデータセットの範囲を定義
                   range ra = %(rw1)col($(a-1));
                   //新しいデータセットの範囲を定義
                    range rb = %(rw1)col($(a));
                    //現在のデータプロットをクリア
                    layer -e ra;
                   //新しいデータセットをグラフに追加
                    layer -i rb;
                   //Y軸のタイトルを変更
                    label -yl Amplitude;
                   //グラフをリフレッシュ
                  doc -uw;
             //グラフ ウィンドウ再描画を待つ
            // これにより動画ファイル作成中に動画を確認できる
            sec -pw %h;
            // 各グラフを2フレームとして動画に書き込み
            err = vw.WriteGraph(%h,2);
            if( err )
                        break;
            }
     
            //ビデオライターをリリース
            vw.Release();
     
            if( err )
                    type "WriteGraph error $(err)";
    }
    else
            type "VideoWriter Create error $(err).";