データプロットを編集する
データマーカーを追加する Graph Layer, Add Data MarkerGraph Layer, Remove Data MarkerGraph Layer, Set Data Marker
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();
}
色を設定するGraph Layer, Set Color on DataPlot
次のサンプルコードは、データプロットの色をセットする方法を示します。
GraphLayer gl = Project.ActiveLayer();
DataPlot dp = gl.DataPlots(0);
bool bRepaint = true;
dp.SetColor(SYSCOLOR_GREEN, bRepaint);
フォーマットツリーの取得Graph Layer, Get Format on DataPlot
OriginObject::GetFormat と OriginObject::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); // フォーマットツリーを取得
折れ線グラフのフォーマットをセットするGraph Layer, Set Format on Line Plot
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);
}
あるデータプロットから別のプロットにフォーマットをコピーするCopy FormatOrigin Object, Copy Format
テーマファイルでフォーマットをコピーするTheme File
データプロットからテーマファイルにフォーマットツリーを取得し保存すると、テーマファイルをツリーにロードし、フォーマットツリーを別のデータプロットに適用できます。
// 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);
散布図のフォーマットをセットするGraph Layer, Set Format on Scatter Plot
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);
}
グループ化した線+シンボルのフォーマットを設定するGraph Layer, Set Format on Grouping Plot
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);
|