一般的なグラフ作成のサンプル

LabTalkによるグラフ作成のサンプル

plotgroup(グループ化変数に従った作図)

グループ化変数(データセット)に従って、 plotgroupはページ毎、レイヤ毎、データプロット毎でグループ化したプロットを作成します。正しく動作させるには、最初にワークシートをグラフグループデータでソートし、次にレイヤグループデータ、最後にデータプロットグループデータでソートします。

/*
このサンプルではグループでプロットする方法を示します
サンプルデータは、Originインストールフォルダの\Samples\Statistics\body.datです。
1.サンプルデータをロード
2.ワークシートをソート
3.グラフを作図
*/
// サンプルデータを取得
fn$ = system.path.program$ + "Samples\Statistics\body.dat";
newbook;
impASC fn$;
// ワークシートをソート - この工程はとても重要
wsort bycol:=3;
// グループごとにプロット
plotgroup iy:=(4,5) pgrp:=Col(3);
 
/* 次のサンプルでは、1つのグループをもとにしたグラフウィンドウを作成し、
2つ目のグループをもとにしたグラフレイヤを作成します*/
// サンプルデータを開く
fn$ = system.path.program$ + "Samples\Graphing\Categorical Data.dat";
newbook;
impASC fn$;
// ソート
dataset sortcol = {4,3}; // drug、genderの順に
dataset sortord = {1,1}; // 昇順でソート
wsort nest:=sortcol ord:=sortord;
// 性別ごとにレイヤを分けて、各薬のグラフを作成
plotgroup iy:=(2,1) pgrp:=col(drug) lgrp:=col(gender);

Note: 各グループ変数は任意です。例えば、ページグループとデータグループを省略することで、レイヤ内のデータを統合する1つのグループ変数を使うことができます。使用するオプションがどれであっても同じソート順にすることが重要です。

plotmatrix(散布図行列を作図)

plotmatrixは、散布図行列を作図します。各データをYとし、Y以外のデータを対応するXデータとして作図していきます。グラフはワークシートのグリッドに作図されます。信頼楕円を含めたり、各グラフで線形フィットしたり、相関係数をレポートするオプションがあります。

// 指定したワークシートの列2、3、5を使用して散布図行列を作図
newbook na:=PlotMatrixEX op:=1;
wo -a 3;   // 3列追加
col(1)=data(1,30);
col(2)=uniform(30);
col(3)=normal(30);
col(4)=uniform(30);
col(5)=col(3);
plotmatrix
  irng:=[PlotMatrixEX]Sheet1!(2,3,5)
  ellipse:=1
  conflevel:=50
  fit:=1;
 
// データとグラフのためのシートを持つ新しいブックを作成
// ソースブックの全シートの列1と2の散布図行列データを
// 集めるためにこのブックを使用する
newbook na:=PMEx2 op:=1;
repeat 3 newsheet;
loop(ii,1,4) {
    page.active = ii;     // 各シートで繰り返す
    col(1) = uniform(25);
    col(2) = uniform(25);
}
for( ii = 1 ; ii <= 4 ; ii++)
{
  range rData = [PMEx2]$(ii)!(1,2);
  plotmatrix
  irng:=rData
  ellipse:=1
  conflevel:=50
  fit:=1
  rd:=[STATS]MyScatterData
  rt:=[STATS]MyScatterGraphs;
}

plotstack(積み上げグラフを作図)

plotstackは、複数データセットから積み上げグラフを作成します。

// サンプルデータを開く
newbook;
string fn$ = system.path.program$ + "Samples\Graphing\Linked Layers 1.dat";
impasc fname:=fn$;
%N = %H;
// 全列対列1の積み上げグラフを作図
plotstack iy:=(1,2:end) plottype:=line link:=1 xlink:=1;

// 列2対列1および列4対列3の積み上げグラフを作図
win -a %N;
plotstack iy:=((1,2), (3,4)) plottype:=column link:=0;

// 使用するテンプレート指定可能。ただし、データセットごとに
// テンプレートのインスタンスをロードするので、単一レイヤのテンプレートを使用
// スタイルフォルダを使用するためには、テンプレートに適応したプロットタイプを指定
win -a %N;
plotstack iy:=((1,2),(1,3),(1,4)) plottype:=3 template:=column;

plotxy(折れ線や散布図など基本的な2Dグラフを作図)

plotxyは、様々なグラフ作図の用途で使用できます。以下が実際のサンプルです。

// Example 1-4で使用する、6列持つシートが
// 3枚あるワークブックを作成
newbook sheet:=3;
string bkName$ = %H;
loop(ii,1,page.nlayers) {
    page.active = ii;
    wo -a 4;
    col(1) = data(1,30);
    col(2) = uniform(30);
    col(3) = normal(30);
    col(4) = 2 * col(2);
    col(5) = 3 * col(3);
    col(6) = col(5) / col(4);
}

////////// Example 1 ////////////////////////////////////////
// アクティブワークシートの3番目のグラフを作成
plotxy 3;
page.label$ = plotxy 3;

////////// Example 2 ////////////////////////////////////////
// アクティブワークシートの列3、4、5を作図t
win -a %(bkName$); // plotxyでブックを指定しないので、ブックをアクティブにする
plotxy 3:5;

// Sheet2の列2をXとして、列3、4、5を作図
// デフォルトの設定でアクティブグラフウィンドウに新しいグラフレイヤを追加
plotxy [bkname$]Sheet2!(2,3:5); // plotxyでブックとシートをしていするのでアクティブにする必要なし

// 2つのレイヤを再編成
layarrange row:=2 col:=1 ygap:=7 left:=12 right:=12 top:=10 bottom:=15;
page.label$ = plotxy 3:5 and [%(bkname$)]Sheet2!(2,3:5);

////////// Example 3 ////////////////////////////////////////
// 次の表記法を使用
//    範囲内全てのyを作図 : (?,1:end)
//    テンプレートを使ってグラフを作図し名前付け : [<new template:=column.otp name:=MyGraph>]
plotxy [bkname$]Sheet3!(?,1:end) pl:=230 ogl:=[<new template:=column.otp name:=MyGraph>];
page.label$ = plotxy [%(bkname$)]Sheet3!(?,1:end) pl:=230 ogl:=[<new template:=column.otp>];

////////// Example 4 ////////////////////////////////////////
// 変数を使用可能
win -a %(bkname$);
range rSheet = $(page.active)!;
range rPage = rSheet.GetPage()$;
for( ix = 1 ; ix < int(rSheet.NCOLS) ; ix += 2 )
{
   plotxy [%(rPage.name$)]%(rSheet.name$)!($(ix),$(ix+1)) ogl:=1;
}

// レイヤ内のデータセットをグループ化して自動で色推移
layer -g;
page.label$ = Using variables with plotxy;

////////// Example 5 ////////////////////////////////////////
// 新しいデータから開始
newbook template:=origin.otw;
impasc fname:=system.path.program$+"Samples\Curve Fitting\Activity.DAT" option.names.FNameToBk:=0;

// ブックとシートの名前を記録
string bkname$ = page.name$;
string shname$ = layer.name$;

// 指定したグラフテンプレートに列Bを3つの範囲に分けて作図
plotxy [bkname$]shname$!((1,2[1:6]),(1,2[7:12]),(1,2[13:18])) plot:=202 ogl:=[<new template:=doubley name:=SamplePlot>];

// テンプレートの2番目のレイヤに列Cの3つの範囲を追加
plotxy [bkname$]shname$!((1,3[1:6]),(1,3[7:12]),(1,3[13:18])) plot:=202 ogl:=2;

// 再スケール
layer1.x.from = 2;
layer1.x.to = 30;
page.label$ = Multi-range plot;

// 作図した全てのグラフを表示
doc -e W {
    win -i;
}
win -s T;
// X値を1番目のワークシートから取得しY値を2番目のシートから取得した
// グループ化プロットを作図
// 両方のシートの列数は同じである必要があります

// アクティブワークブックの名前を保存
string sbook$ = %H;

// アクティブシートの列数
int num_cols = wks.ncols;

// 新しいグラフを作成
win -t plot;

// 列の数繰り返す
for (int ii = 1; ii <= num_cols; ii++)
{
        // シート1の列インデックスiiをX、
        // シート2の列インデックスiiをYとして、
        // 新しいグラフの1番目のレイヤにプロットを追加
        plotxy iy:=[sbook$](1!$(ii), 2!$(ii)) plot:=201 ogl:=!1;
}

//レイヤ内のプロットをグループ化
layer -g;

plotxyz(XYZデータから3Dグラフを作図)

XYZワークシートデータから3Dグラフを作成するために、Xファンクションplotxyzを使用します。以下がサンプルです。

////////// Example 1 ////////////////////////////////////////
//離散したデータから3D棒グラフを作図
//データファイルをインポート
string fn$=system.path.program$ + "\Samples\Statistics\automobile.dat"; 
impasc fname:=fn$; 
//列属性を設定
wks.col3.type=6;
wks.col4.type=4;
wks.col6.type=1;
//ワークシートから列を選択して3D棒グラフを作成
plotxyz iz:=(4,6,3) plot:=242 ogl:=<new template:=gl3dbars>;
//スピードモードをオフにしてグラフをリフレッシュ
layer.maxpts=0;
doc -uw;

////////// Example 2 ////////////////////////////////////////
//3Dカラーマップ曲面図を作図して上部に等高線図を投影
//データファイルをインポート
string fn$=system.path.program$ + "\Samples\Graphing\Gaussian Surface.dat"; 
impasc fname:=fn$; 
//3列目をZとして設定
wks.col3.type=6;
plotxyz iz:=3 plot:=103 ogl:=<new template:=glcmap>;
layer -ip103 %c;
range rr = 2;
set rr -spf 1;
set rr -spz 100;

////////// Example 3 ////////////////////////////////////////
//3つの範囲に分けて3D散布図を作図
//データファイルをインポート
string fn$=system.path.program$ + "\Samples\Statistics\Fisher's Iris Data.dat"; 
impasc fname:=fn$; 
//3番目の列をZとして設定
wks.col3.type=6;
//範囲分け
range r1=col(3)[1:50];
range r2=col(3)[51:100];
range r3=col(3)[101:end];
//同じレイヤにそれぞれの3D散布図を作図
plotxyz iz:=r1 plot:=240 ogl:=<new template:=gl3d>;
plotxyz iz:=r2 plot:=240 ogl:=[%H]1!;
plotxyz iz:=r3 plot:=240 ogl:=[%H]1!;
legendupdate;

plotm

Xファンクションplotmは、カスタムテンプレートを使って行列からグラフを作図するときに使用します。

newbook name:=MyMatrix mat:=1;
matrix -v x^2-y^2;        
plotm im:=<active> plot:=103 ogl:=<new template:=glcmap>;

3D曲面図のカラーマップは、set %C -b3c を使用して他の行列オブジェクトから設定することもできます。

newbook name:=CMap mat:=1;
matrix -v 10*x+10*y;    //カラーマップ曲面用の行列を設定
newbook name:=MyMatrix mat:=1;
matrix -v x^2+y^2;        //曲面用の行列を設定 
plotm im:=<active> plot:=103 ogl:=<new template:=glcmap>;  //曲面用の行列を3Dカラーマップ曲面図として作図

range rr=[Cmap]1!1;  //rangeを定義
set %C -b3c rr;  //ほかの行列オブジェクトからカラーマップを設定

plotmを使用して3Dボックスと球体を作図

次のコード サンプルでは、​​3Dレイヤに3Dボックスと球体を作成します。ボックスには6つの壁があり、plotmで平面の3D パラメトリック関数としてプロットされます。メッシュは有効になっています。球は、特定の半径と座標でプロットされます。

//////////////////////////////////// Plot3DSphere /////////////////////////////////////////
function int plotSphere(ref string gg$, double dXc, double dYc, double dZc, double dR) {
        type -a Sphere  Center:{$(dXc), $(dYc), $(dZc)}, Radius:$(dR);
        int newg = exist(gname$)==3?0:1;
        string enu$, bk$;
        int npts = 30;//正方行列
        create myx3 -fp2 npts "dR*sin(v)*cos(u)+dXc" -pi/2 pi/2 npts 0 2*pi; 
        create myy3 -fp2 npts "dR*cos(v)*cos(u)+dYc" -pi/2 pi/2 npts 0 2*pi;
        create myz3 -fp2 npts "dR*sin(u)+dZc" -pi/2 pi/2 npts 0 2*pi; 
        create FunSphere -mfp myz3 myx3 myy3 "u,v";
        enu$ = mid(%H,10)$;  //列挙部分を取得。%Hは、新しく作成されたアクティブ行列ウィンドウ名を保存
        bb$="FunSphere"+enu$;
        window -ch 1;  //行列ウィンドウを隠す
        if(exist(gg$)==3)  //グラフが存在
                plotm im:=[%(bb$)]1!1 plot:=103 x:=2 y:=3 ogl:=[gg$]1!;
        else 
                plotm im:=[%(bb$)]1!1 plot:=103 x:=2 y:=3;   //ライトは"ogl:=<new template:=EllipsoidLTCyan>"オプションを使用
        set %(bb$) -b3cc  22;  //color: 22=LT Cyan
        set %(bb$) -b3m 1;//0:メッシュなし、1:メッシュ
        return 0;
}

//////////////////////////////////// plotOneSide /////////////////////////////////////////
function int plotOneSide(string bb$, string gg$, int cc) {
        //type -a In plotOneSide:  bb: %(bb$) gg: %(gg$);
        if(exist(gg$)==3)  //グラフが存在
                plotm im:=[%(bb$)]1!1 plot:=103 x:=2 y:=3 ogl:=[gg$]1!;
        else 
                plotm im:=[%(bb$)]1!1 plot:=103 x:=2 y:=3;   //ライトは"ogl:=<new template:=EllipsoidLTCyan>"オプションを使用
        set %(bb$) -b3cc cc;//color
        set %(bb$) -b3m 1;//0:メッシュなし、1:メッシュ
        return 0;
}
//////////////////////////////////// Plot3DBox /////////////////////////////////////////
function int plot3DBox(ref string gname$, double dX1, double dX2, double dY1, double dY2, double dZ1, double dZ2) {
        type -a 3DBox  X:$(dX1)==>$(dX2), Y:$(dY1)==>$(dY2), Z:$(dZ1)==>$(dZ2);
        int newg = exist(gname$)==3?0:1;
        string enu$, bk$;
        int npts = 5;//正方行列
        //// LEFT
        //3Dパラメトリック関数プロット用のx、y、zの2Dルースデータセットを作成
        create myx -fp2 npts u dX1 dX2 npts dZ1 dZ2; 
        create myy -fp2 npts dY1 dX1 dX2 npts dZ1 dZ2;
        create myz -fp2 npts v dX1 dX2 npts dZ1 dZ2;
        //Create matrices for left wall from 2D loose datasets for 3D parametric function plot
        create FuncLeft -mfp myz myx myy "u,v";     //アクティブ行列を作成
        //create FuncLeft -mfph myz myx myy "u,v";  //非表示行列を作成(Origin 2017)
        //////////////////////////////////////////////////
        enu$ = mid(%H,9)$;  //列挙部分を取得。%Hは新しく作成されたアクティブ行列ウィンドウ名
        window -ch 1;       //非表示行列ウィンドウ
        //enu$ = mid("%@N",9)$;  //列挙部分を取得。%@N は新しく作成されたウィンドウ名
        ///////////////////////////////////////////////////
        //// RIGHT
        //3Dパラメトリック関数プロット用のx、y、zの2Dルースデータセットを作成
        create myx -fp2 npts u dX2 dX1 npts dZ1 dZ2;     //外側右面
        create myy -fp2 npts dY2 dX1 dX2 npts dZ1 dZ2;
        create myz -fp2 npts v dX1 dX2 npts dZ1 dZ2;
        //3Dパラメトリック関数プロット用の2Dルースデータセットから右壁の行列を作成
        create FuncRight -mfph myz myx myy "u,v";
        ////FRONT
        //3Dパラメトリック関数プロット用のx、y、zの2Dルースデータセットを作成
        create myx -fp2 npts dX2 dY1 dY2 npts dZ1 dZ2;
        create myy -fp2 npts u dY1 dY2 npts dZ1 dZ2;
        create myz -fp2 npts v dY1 dY2 npts dZ1 dZ2;
        //3Dパラメトリック関数プロット用の2Dルースデータセットから正面壁の行列を作成
        create FuncFront -mfph myz myx myy "u,v";
        //// BACK
        //3Dパラメトリック関数プロット用のx、y、zの2Dルースデータセットを作成
        create myx -fp2 npts dX1 dY1 dY2 npts dZ1 dZ2;
        create myy -fp2 npts u dY2 dY1 npts dZ2 dZ1;   //外側 背面
        create myz -fp2 npts v dY1 dY2 npts dZ1 dZ2;
        //3Dパラメトリック関数プロット用の2Dルースデータセットから背面壁の行列を作成
        create FuncBack -mfph myz myx myy "u,v";
        //// TOP
        //3Dパラメトリック関数プロット用のx、y、zの2Dルースデータセットを作成
        create myx -fp2 npts u dX1 dX2 npts dY1 dY2;
        create myy -fp2 npts v dX1 dX2 npts dY1 dY2;
        create myz -fp2 npts dZ2 dX1 dX2 npts dY1 dY2;
        //3Dパラメトリック関数プロット用の2Dルースデータセットから上壁の行列を作成
        create FuncTop -mfph myz myx myy "u,v";
        //// BOTTOM
        //3Dパラメトリック関数プロット用のx、y、zの2Dルースデータセットを作成
        create myx -fp2 npts u dX2 dX1 npts dY1 dY2;   //外側 底面
        create myy -fp2 npts v dX1 dX2 npts dY1 dY2;
        create myz -fp2 npts dZ1 dX1 dX2 npts dY1 dY2;
        //3Dパラメトリック関数プロット用のx、y、zの2Dルースデータセットを作成
        create FuncBottom -mfph myz myx myy "u,v";
        //////////////////////////////////////////////////////////
        // 作図
        if(newg==0) {
          win -o %(gname$) {
                type "> Adding a plot of the Left face to the existing graph %(gname$)";
                plotOneSide("FuncLeft"+enu$, gname$, 5);
          }
        }
        else {
                plotOneSide("FuncLeft"+enu$, gname$, 5);
                gname$=%H; //作成したグラフ ウィンドウ名を保持
                //type "> Creating a new graph %(gname$) by plotting the Left face";
        }
        win -o %(gname$) {
                //type "adding other faces to %(gname$)";
                plotOneSide("FuncRight"+enu$, gname$,5); //右の壁を CYAN でプロット
                plotOneSide("FuncFront"+enu$, gname$,4);  //前面の壁を BLUE でプロット
                plotOneSide("FuncBack"+enu$, gname$, 4);  //背面の壁をBLUEでプロット
                plotOneSide("FuncTop"+enu$, gname$, 6);  //上壁をMAGENTAでプロット
                plotOneSide("FuncBottom"+enu$, gname$,6);  //下壁をMAGENTAでプロット
        }
        return 0;
}
//////////////////////////////////////////////////
//                    MAIN                       //
//////////////////////////////////////////////////
string str$;
plot3DBox(str, 0, 3, 0, 1.5, 0, 1);    //plot3DBox を実行して最初の 3D ボックスを作成
plotSphere(str, 5, 4, 4, 0.5);         //plotSphere を実行して球体を作成

//タイミングによってはアクティブウィンドウがグラフではない可能性があるためwin -oを使用
win -o %(str$) {
    x1=0; x2=5; y1=0; y2=5; z1=0; z2=5;  //ボックスをエッジに合わせてスケーリング
    win -a %(str$);  //グラフウィンドウをアクティブとして最前面に配置
}

Scr 3DBoxSphere.jpg

plotpClamp

XファンクションplotpclampはpClampインポートでインポートされたデータのグラフ作成を行います。ここでは、サンプルのpClampファイルを取り込み、プロットXファンクションパネルを表示せずにプロットします。

fname$=system.path.program$+"Samples\Import and Export\pCLAMP\93311C01.DAT";
imppClamp;
plotpclamp 1:end tag:=1 stimulur:=1 septstim:=0 ctrl:=0 mode:=2;