データプロットを追加する


プロット または データプロット は、グラフレイヤ内のデータ表示です。 各グラフレイヤには、1つ以上のプロットが含まれます。


2D グラフ (XY, Yエラー, 縦棒/横棒)

XY散布図をプロット

次のコードは、アクティブワークシートから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(); // 軸を再スケールしすべてのデータポイントを表示
}

Yエラープロットを付ける

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グラフ

行列からグラフウィンドウに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 等高線図をプロット

// 実行前に、アクティブワークシートウィンドウに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);

複数区分グラフ (X軸を共有した複数レイヤ)

次のサンプルは、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();
	}		
}