プロット または データプロット は、グラフレイヤ内のデータ表示です。 各グラフレイヤには、1つ以上のプロットが含まれます。
次のコードは、アクティブワークシートからXYYErrデータ範囲を構築する方法を示し、新しく作成したグラフでデータ範囲をプロットします。
Worksheet wks = Project.ActiveLayer(); // 範囲名は、X, Y, Z, ED(YErr)にする DataRange dr; dr.Add(wks, 0, "X"); // 第1列はXデータ dr.Add(wks, 1, "Y"); // 第2列はYデータ dr.Add(wks, 2, "ED"); // 第1列はYエラーデータ(任意) // グラフウィンドウを作成 GraphPage gp; gp.Create("Origin"); GraphLayer gl = gp.Layers(); // アクティブレイヤを取得 // XYデータ範囲を散布図としてプロット // IDM_PLOT_SCATTER はプロットタイプIDで、他のタイプのIDはoPlotIDs.h ファイルを確認 int nPlotIndex = gl.AddPlot(dr, IDM_PLOT_SCATTER); // プロットインデックス(オフセットは0)を返す、エラーは-1を返す if( nPlotIndex >= 0 ) { gl.Rescale(); // 軸を再スケールしすべてのデータポイントを表示 }
YErrデータを既存のXYデータプロットに付加します。
GraphLayer gl = Project.ActiveLayer(); DataPlot dp = gl.DataPlots(-1); // アクティブデータプロットを取得 // Yエラー列を取得 WorksheetPage wksPage("Book1"); Worksheet wks = wksPage.Layers(); Column colErrBar(wks, 2); // アクティブデータプロットにYエラー列をプロット Curve crv(dp); int nErrPlotIndex = gl.AddErrBar(crv, colErrBar); out_int("nErrPlotIndex = ", nErrPlotIndex);
// 実行前にアクティブウィンドウがワークシートであることを確認 Worksheet wks = Project.ActiveLayer(); DataRange dr; dr.Add(wks, 1, "Y"); // 1列を持つデータ範囲を構築 GraphPage gp; gp.Create("BAR"); // 指定したテンプレートでグラフを作成 GraphLayer gl = gp.Layers(-1); // アクティブグラフレイヤを取得 int index = gl.AddPlot(dr, IDM_PLOT_BAR); if( index >= 0 ) { out_str("Plot bar"); gl.Rescale(); }
行列からグラフウィンドウに3D曲面図をプロットします。
// 行列データを用意 MatrixLayer ml; string strFile = GetAppPath(true) + "Samples\\Matrix Conversion and Gridding\\ 2D Gaussian.ogm"; ml.Open(strFile); MatrixObject mo = ml.MatrixObjects(0); // テンプレートでグラフページを作成 GraphPage gp; gp.Create("CMAP"); GraphLayer gl = gp.Layers(0); // 3D 曲面図をプロット int nPlotIndex = gl.AddPlot(mo, IDM_PLOT_SURFACE_COLORMAP); if(0 == nPlotIndex) { gl.Rescale(); printf("3D Surface plotted successfully\n"); }
// 実行前に、アクティブワークシートウィンドウにXYZデータがあることを確認 // または、\Samples\Matrix Conversion and Gridding\ // XYZ Random Gaussian.dat をワークシートにインポート Worksheet wks = Project.ActiveLayer(); DataRange dr; dr.Add(wks, 0, "X"); dr.Add(wks, 1, "Y"); dr.Add(wks, 2, "Z"); // テンプレートでグラフページを作成 GraphPage gp; gp.Create("TriContour"); GraphLayer gl = gp.Layers(); // タイプIDでXYZ等高線をプロット int nPlot = gl.AddPlot(dr, IDM_PLOT_TRI_CONTOUR); if( nPlot >= 0 ) { gl.Rescale(); printf("XYZ contour plotted successfully\n"); }
MatrixLayer ml = Project.ActiveLayer(); MatrixObject mo = ml.MatrixObjects(0); // テンプレートでグラフウィンドウを作成 GraphPage gp; gp.Create("contour"); GraphLayer gl = gp.Layers(); int nPlot = gl.AddPlot(mo, IDM_PLOT_CONTOUR); if( nPlot >= 0 ) { gl.Rescale(); }
MatrixLayer ml = Project.ActiveLayer(); MatrixObject mo = ml.MatrixObjects(0); // テンプレートでグラフウィンドウを作成 GraphPage gp; gp.Create("image"); GraphLayer gl = gp.Layers(); int nPlot = gl.AddPlot(mo, IDM_PLOT_MATRIX_IMAGE); if( nPlot >= 0 ) { gl.Rescale(); }
次のサンプルコードは、1つのグラフレイヤ内の4つの軸-左、下、右、上の表示/非表示をセットし、フォーマットをセットする方法を示します。
#include <..\Originlab\graph_utils.h> // AXIS_* で必要 GraphLayer gl = Project.ActiveLayer(); // 全ての軸とラベルを表示。0 または 1, 1 は表示。 vector<int> vnAxes(4), vnLabels(4), vnTitles(4); vnAxes[AXIS_BOTTOM] = 1; vnAxes[AXIS_LEFT] = 1; vnAxes[AXIS_TOP] = 1; vnAxes[AXIS_RIGHT] = 1; vnLabels = vnAxes; // 左と下の軸の軸タイトルを表示。0 または 1, 1 は表示。 vnTitles[AXIS_BOTTOM] = 1; vnTitles[AXIS_LEFT] = 1; vnTitles[AXIS_TOP] = 0; vnTitles[AXIS_RIGHT] = 0; // すべての軸の主刻みと副刻みを内側にセット // 他のオプションについてはgraph_utils.hのTICK_*項目を参照 vector<int> vnMajorTicks(4), vnMinorTicks(4); vnMajorTicks[AXIS_BOTTOM] = TICK_IN; vnMajorTicks[AXIS_LEFT] = TICK_IN; vnMajorTicks[AXIS_TOP] = TICK_IN; vnMajorTicks[AXIS_RIGHT] = TICK_IN; vnMinorTicks = vnMajorTicks; gl_smart_show_object(gl, vnAxes, vnLabels, vnTitles, vnMajorTicks, vnMinorTicks);
次のサンプルは、1つのグラフページに複数のグラフレイヤを構築し、すべてのレイヤのX軸を共有し、XYデータセットをワークシートデータから各グラフレイヤにプロットする方法を示します。
次のコードをコンパイルする前に、現在のワークスペースにgraph_utils.cをビルドするために、次のコマンドを実行する必要があります。
run.LoadOC(Originlab\graph_utils.c, 16);
次のOrigin Cコードをコンパイルします。実行する前に、1つのX列と少なくとも2つのY列を持つBook1というワークブックがあることを確認します。
#include <..\Originlab\graph_utils.h> //page_add_layer 関数に対して必要 // Book1からデータ範囲を構築 WorksheetPage wksPage("Book1"); Worksheet wks = wksPage.Layers(0); // Book1の最初のワークシートを取得 DataRange dr; dr.Add(wks, 0, "X"); // Xデータを第1列 dr.Add(wks, 1, "Y", -1); // 最後のYデータを第2列 // Yの数を取得 DWORD dwRules = DRR_GET_DEPENDENT | DRR_NO_FACTORS; int nNumYs = dr.GetNumData(dwRules); // 右軸を持つレイヤを追加し、最初のレイヤにリンク GraphPage gp; gp.Create("Origin"); while ( gp.Layers.Count() < nNumYs ) { page_add_layer(gp, false, false, false, true, ADD_LAYER_INIT_SIZE_POS_MOVE_OFFSET, false, 0, LINK_STRAIGHT); } // ループして各XYデータからグラフレイヤにプロットを追加 foreach(GraphLayer gl in gp.Layers) { int nLayerIndex = gl.GetIndex(); // drから部分XY範囲を取得 DataRange drOne; dr.GetSubRange(drOne, dwRules, nLayerIndex); // 1つのXY範囲をグラフレイヤにプロット int nPlot = gl.AddPlot(drOne, IDM_PLOT_LINE); if( nPlot >= 0 ) { DataPlot dp = gl.DataPlots(nPlot); dp.SetColor(nLayerIndex); //データプロットを異なる色にセット // 右Y軸の軸刻みと軸ラベルの色を自動にセット gl.YAxis.AxisObjects(AXISOBJPOS_AXIS_SECOND).RightTicks.Color.nVal = gl.YAxis.AxisObjects(AXISOBJPOS_LABEL_SECOND).RightLabels.Color.nVal = INDEX_COLOR_AUTOMATIC; gl.Rescale(); } }