データプロットを編集する


データマーカーを追加する

Origin Cは、データマーカを編集するのに次のメソッドをサポートします。

次のコードは、アクティブグラフに2つのデータマーカを追加する方法を示しています。

GraphLayer gl = Project.ActiveLayer();
DataPlot dp = gl.DataPlots();

// データマーカのインデックス
vector<int> vnBegin = {0, 9};
vector<int> vnEnd = {4, 14};

// 2つのデータマーカを追加
int nRet = dp.AddDataMarkers(vnBegin, vnEnd);
if( 0 == nRet )
{
	out_str("Add data marker successfully.");
}

以下のコードは、現在のデータマーカの位置を変更します。

GraphLayer gl = Project.ActiveLayer();
DataPlot dp = gl.DataPlots();

// データマーカのインデックス
vector<int> vnBegin = {11, 2};
vector<int> vnEnd = {19, 5};
vector<int> vnIndices = {1, 0};

// 2つのデータマーカを追加
int nRet = dp.SetDataMarkers(vnBegin, vnEnd, vnIndices);
if( 0 == nRet )
{
	out_str("Set data marker successfully.");
	gl.GetPage().Refresh();
}

色を設定する

次のサンプルコードは、データプロットの色をセットする方法を示します。

GraphLayer gl = Project.ActiveLayer();
DataPlot dp = gl.DataPlots(0);

bool bRepaint = true;
dp.SetColor(SYSCOLOR_GREEN, bRepaint);

フォーマットツリーの取得

OriginObject::GetFormatOriginObject::ApplyFormat は、Originオブジェクトフォーマットを取得するのに使われます。 次のフォーマットの取得、セット、コピーのメカニズムは、OriginObjectの基底クラスから派生するクラスを持つすべてのOriginオブジェクトに対して使うことができます(クラスの階層を参照)。 例えば、Originオブジェクトは、DataPlot クラス, Worksheet クラス, WorksheetPage クラス, MatrixLayer クラス, MatrixPage クラス, GraphLayer クラス, GraphPage クラスのオブジェクトにすることができます。

DataPlot クラスは、DataObjectBase クラスから派生され、DataObjectBase クラスは、OriginObject クラスがら派生されるので、DataPlot::GetFormat を呼び出して、フォーマットツリー構造を取得できます。

次のコードを使って、フォーマットツリー構造を見る2つの方法があります。

  • 次のコードで、GetFormat の行にブレークポイントを設定し、1つのデータをアクティブにし、コードを実行し、F10を押し(ステップオーバー)、GetFormat 行を実行し、コードビルダのローカル変数ウィンドウで、tr変数のフォーマットツリーの詳細を見ます。(Alt+4を押し、ローカル変数ウィンドウを開いたり、閉じたりできます。)
  • 最後の行 out_tree(tr); を使って、フォーマットツリーを出力します。
GraphLayer gl = Project.ActiveLayer();
DataPlot dp = gl.DataPlots(-1); // アクティブデータプロットを取得
 
// 異なるプロットタイプ(例えば、折れ線、ボックスチャート...) は、
// フォーマットツリーの異なる構造を持ちます。
Tree tr;
 
// ツリー構造の詳細を表示するフォーマットツリーを取得
tr = dp.GetFormat(FPB_ALL, FOB_ALL, true, true);

out_tree(tr); // フォーマットツリーを取得

折れ線グラフのフォーマットをセットする

GraphLayer gl = Project.ActiveLayer();
DataPlot dp = gl.DataPlots(-1); //アクティブデータプロットを取得
  
// 折れ線プロットのフォーマットをセット
// Note:フォーマットツリーの構造を取得するには前のセクションを参照
Tree tr;
tr.Root.Line.Connect.nVal = 2; // 2点のセグメントに対しては2
tr.Root.Line.Color.nVal = RGB2OCOLOR(RGB(100, 100, 220));
tr.Root.Line.Width.dVal = 1.5;
 
if( 0 == dp.UpdateThemeIDs(tr.Root) )
{
    bool bRet = dp.ApplyFormat(tr, true, true); 
}

あるデータプロットから別のプロットにフォーマットをコピーする

テーマファイルでフォーマットをコピーする

データプロットからテーマファイルにフォーマットツリーを取得し保存すると、テーマファイルをツリーにロードし、フォーマットツリーを別のデータプロットに適用できます。

// Graph1からテーマファイルにプロット設定を保存
GraphPage gpSource("Graph1");
GraphLayer glSource = gpSource.Layers(0);
DataPlot dpSource = glSource.DataPlots(0);

Tree tr;
tr = dpSource.GetFormat(FPB_ALL, FOB_ALL, true, true);
string strTheme = GetAppPath(false) + "plotsettings.XML";
tr.Save(strTheme);

// テーマファイルからプロット設定をツリーにロードし、
// ツリーからデータプロットオブジェクトにフォーマットを適用
GraphPage gpDest("Graph2");
GraphLayer glDest = gpDest.Layers(0);	
DataPlot dpDest = glDest.DataPlots(0);

Tree tr2;
tr2.Load(strTheme);
dpDest.ApplyFormat(tr2, true, true);

ツリーでフォーマットをコピーする

あるデータプロットからのプロット設定をツリーに取得すると、このツリーから別のプロットオブジェクトに設定を適用できます。

GraphPage gpSource("Graph1");
GraphLayer glSource = gpSource.Layers(0);
DataPlot dpSource = glSource.DataPlots(0);

GraphPage gpDest("Graph2");
GraphLayer glDest = gpDest.Layers(0);	
DataPlot dpDest = glDest.DataPlots(0);

// 元のデータプロットからフォーマットを取得
Tree tr;
tr = dpSource.GetFormat(FPB_ALL, FOB_ALL, true, true);

// フォーマットを別のデータプロットに適用
dpDest.ApplyFormat(tr, true, true);

散布図のフォーマットをセットする

GraphLayer gl = Project.ActiveLayer();
DataPlot dp = gl.DataPlots(-1); // アクティブデータプロットを取得

// シンボルフォーマットをセット
Tree tr;
tr.Root.Symbol.Size.nVal = 12; // シンボルのサイズ
tr.Root.Symbol.Shape.nVal = 1; // 円
tr.Root.Symbol.Interior.nVal = 1; // 内部
tr.Root.Symbol.EdgeColor.nVal = SYSCOLOR_RED;
tr.Root.Symbol.FillColor.nVal = SYSCOLOR_BLUE;

// 垂直ドロップラインの表示
tr.Root.DropLines.Vertical.nVal = 1;
tr.Root.DropLines.VerticalColor.nVal = SYSCOLOR_LTGRAY;
tr.Root.DropLines.VerticalStyle.nVal = 1;
tr.Root.DropLines.VerticalWidth.nVal = 1.5;

if( 0 == dp.UpdateThemeIDs(tr.Root) )
{
    bool bRet = dp.ApplyFormat(tr, true, true); 
}

グループ化した線+シンボルのフォーマットを設定する

Origin Cを使って、グループ化したプロットに対するフォーマットをセットします。 同じ操作を、作図の詳細ダイアログで、グループタブで行うことができます。フォーマットには線の色、シンボルタイプ、シンボルの内部、線種が含まれます。

次のサンプルは、線+シンボルグラフのフォーマットをセットする方法を示しています。このグループには4つのデータプロットがあるものとします。

GraphLayer gl = Project.ActiveLayer(); 
GroupPlot gplot = gl.Groups(0); // レイヤ内の最初のグループ

// Nesterはグループ内でネストするオブジェクトタイプの配列
// グループ内で周期的にネストする4種類の設定
vector<int> vNester(3); 
vNester[0] = 0;  // グループ内で周期的に線の色を変更
vNester[1] = 3;  // グループ内で周期的にシンボルを変更
vNester[2] = 8;  // グループ内で周期的にシンボル内部を変更
gplot.Increment.Nester.nVals = vNester;  // グループプロットのNester

// フォーマット設定を4つのプロットへのvectorに配置
vector<int> vLineColor = {SYSCOLOR_BLUE, SYSCOLOR_OLIVE, SYSCOLOR_RED, 
		SYSCOLOR_CYAN};
vector<int> vSymbolShape = {1, 3, 5, 8};
vector<int> vSymbolInterior = {1, 2, 5, 0};

Tree tr;
tr.Root.Increment.LineColor.nVals = vLineColor;  // 線の色をテーマツリーにセット
tr.Root.Increment.Shape.nVals = vSymbolShape;  // シンボルの形状をテーマツリーにセット
// シンボルの内部をテーマツリーにセット
tr.Root.Increment.SymbolInterior.nVals = vSymbolInterior;  

if(0 == gplot.UpdateThemeIDs(tr.Root) )    
{
	bool bb = gplot.ApplyFormat(tr, true, true);    // テーマツリーを適用
}

カラーマップ設定を設定する

DataPlotクラスは、カラーマップの設定をするための2つのオーバーロードメソッド持ちます。

  • DataPlot::SetColormap( const vector<double> & vz, BOOL bLogScale = FALSE ) は、Z値レベルとスケールタイプ(対数かそうでないか)の設定だけに使用されます。vz 引数内の値はZ値です。
  • DataPlot::SetColormap( TreeNode& trColormap ) は、すべてのカラーマップ設定に使用されます。たとえば、Z値、色、線のフォーマット、テキストラベルのフォーマット等の設定をします。

次のサンプルでは、等高線図のZカラーマップの設定方法を示します。

GraphLayer gl = Project.ActiveLayer();
DataPlot dp = gl.DataPlots(0);

// Zレベルの元のカラーマップを取得
vector vZs;
BOOL bLogScale = FALSE;
BOOL bRet = dp.GetColormap(vZs, bLogScale);
int nLevels = vZs.GetSize();    

// Zレベルのvectorを減少させ、DataPlotに戻してセット
double min, max;
vZs.GetMinMax(min, max);
double dChangeVal = fabs(max - min) * 0.2;
bool bIncrease = true;
if( !bIncrease )
	dChangeVal = 0 - dChangeVal;

min = min - dChangeVal;
max = max - dChangeVal;
double inc = (max - min) / nLevels;    
vZs.Data(min, max, inc);

dp.SetColormap(vZs);

次のサンプルでは、カラーマップZ値レベルをLog10スケールタイプでセットする方法を示しています。

bool plot_matrix(LPCSTR lpsczMatPage, LPCSTR lpcszGraphTemplate = "contour"
		, int nPlotID = IDM_PLOT_CONTOUR)
{
	// 特定行列ページから行列オブジェクトを取得
	MatrixPage matPage = Project.MatrixPages(lpsczMatPage);
	if( !matPage )
	{
		out_str("Invalid matrix page");
		return false;
	}
	// 行列ページのアクティブシートを取得
	MatrixLayer ml = matPage.Layers(-1); 
	// 行列シート内のアクティブ行列オブジェクトを取得
	MatrixObject mobj = ml.MatrixObjects(-1); 	
	
	// テンプレートで非表示のグラフページを作成し、プロットを追加
	// 非表示として、描画しない           
	GraphPage gp;
	gp.Create(lpcszGraphTemplate, CREATE_HIDDEN);
	GraphLayer glay = gp.Layers();
	
	int nPlot = glay.AddPlot(mobj, nPlotID);
	if(nPlot < 0)
	{
		out_str("fail to add data plot to graph");
	    return false; 
	}
	glay.Rescale(); // XY軸を再スケール
	     
	
	// Zレベルベクトルを構築
	int nNewLevels = 4;    
	double min = 0.1, max = 100000.;
	double step = (log10(max) - log10(min)) / (nNewLevels - 1);
	
	vector vLevels;
	vLevels.SetSize(nNewLevels);
	vLevels.Data(log10(min), log10(max), step);   
	vLevels = 10^vLevels;	
	
	// パーセントでZ値をセット。実際のZ値ではないことに注意
	// 最初の値は0、最後の値は < 100 である必要がある
	vLevels = 100*(vLevels - min)/(max - min); 
	
	Tree tr;
	tr.ColorMap.Details.Levels.dVals = vLevels;
	tr.ColorMap.ScaleType.nVal = 1; // 1 は log10
	tr.ColorMap.Min.dVal = min;
	tr.ColorMap.Max.dVal = max;
	
	DataPlot dp = glay.DataPlots(nPlot);               
	bool bRet = dp.SetColormap(tr); 
	if( !bRet )
	{
		out_str("fail to set colormap");
		return false;
	}
	
	gp.Label = "Plot created using template: " + (string)lpcszGraphTemplate;
	gp.TitleShow = WIN_TITLE_SHOW_BOTH;
	gp.SetShow(); // 用意できたら表示
	
	return true;
}

上述のplot_matrix 関数をcoutour テンプレートとともに呼び出し、IDM_PLOT_CONTOUR プロットid で等高線図を作成してカラーマップをセットします。

void plot_contour_ex(LPCSTR lpcszMatPage)
{ 
    plot_matrix(lpcszMatPage, "contour", IDM_PLOT_CONTOUR);
}

上述の plot_matrix 関数を image テンプレートと共に呼び出し、IDM_PLOT_MATRIX_IMAGE プロット id でイメージグラフを作成してカラーマップをセットします。

void plot_image_ex(LPCSTR lpcszMatPage)
{ 
    plot_matrix(lpcszMatPage, "image", IDM_PLOT_MATRIX_IMAGE);
}

次のサンプルでは、塗りつぶし色を削除し、等高線図の線の色、スタイル、幅、テキストラベルをセットします。

GraphLayer gl = Project.ActiveLayer();
DataPlot dp = gl.DataPlots(0);
 
Tree tr;
dp.GetColormap(tr);
 
// 塗りつぶし色削除
tr.ColorFillControl.nVal = 0;
 
// 線の色を設定
vector<int> vnLineColors;
vnLineColors = tr.Details.LineColors.nVals;
int nLevels = vnLineColors.GetSize();
vnLineColors.Data(1, nLevels, 1);
tr.Details.LineColors.nVals = vnLineColors;
 
// 全ての線のスタイルを破線にセット
vector<int> vnLineStyles(vnLineColors.GetSize());
vnLineStyles = 1;
tr.Details.LineStyles.nVals = vnLineStyles;
 
// 全ての線の幅をセット
vector vdLineWidths(vnLineColors.GetSize());
vdLineWidths = 3;
tr.Details.LineWidths.dVals = vdLineWidths;    
 
// ラベルの表示/非表示。最初の2つ以外を表示
vector<int> vnLabels(vnLineColors.GetSize());
vnLabels = 1;    
vnLabels[0] = 0;
vnLabels[1] = 0;
tr.Details.Labels.nVals = vnLabels;    
 
// グラフの背景の設定
dp.SetColormap(tr);

このサンプルでは、等高線グラフのテキストラベルのフォーマット(例:色、サイズ、太字、斜体)をセットする方法を示します。

GraphLayer gl = Project.ActiveLayer();
DataPlot dp = gl.DataPlots(0);

// カラーマッププロットの関連オブジェクトのすべてのプロパティを取得
Tree tr;
tr = dp.GetFormat(FPB_ALL, FOB_ALL, true, true);

// すべてのラベルを表示
vector<int> vnLabels;
vnLabels = tr.Root.ColorMap.Details.Labels.nVals;
vnLabels = 1;// 0 は非表示、1 は表示
tr.Root.ColorMap.Details.Labels.nVals = vnLabels;

// ラベルに対して数値フォーマットをセット
tr.Root.NumericFormats.Format.nVal = 0; // 十進法
tr.Root.NumericFormats.DigitsControl.nVal = 0;
tr.Root.NumericFormats.SignificantDigits.nVal = 5;//小数点以下桁数
tr.Root.NumericFormats.Prefix.strVal = "_";
tr.Root.NumericFormats.Suffix.strVal = "Label";
tr.Root.NumericFormats.MinArea.nVal = 5; // ラベル Criteria - Min Area(%)

// ラベルに対してテキストフォーマットをセット
tr.Root.Labels.Color.nVal = SYSCOLOR_BLUE;
//FontFaceIndex_to_DWORD は、GUIインデックスからDWORD実数値に変換するのに使用
tr.Root.Labels.Face.nVal = FontFaceIndex_to_DWORD(2);// GUI内に3番目のフォントを選択
tr.Root.Labels.Size.nVal = 20;
tr.Root.Labels.WhiteOut.nVal = 1;
tr.Root.Labels.Bold.nVal = 1;
tr.Root.Labels.Italic.nVal = 1;
tr.Root.Labels.Underline.nVal = 1;

if(0 == dp.UpdateThemeIDs(tr.Root) )
	dp.ApplyFormat(tr, true, true);