XRT/graph FAQ
リソース
XRT/graphの軸の注釈を独自のラベルで置き換えるには?
XtNxrtAnnotationMethodをXRT_ANNO_VALUE_LABELSにセットし、値とストリング のペアを指定します。 このペアにはarray、generalのどちらのフォ-マットも使用できます。 詳細は、マニュアルの31ペ-ジを参照してください。
凡例の位置をコントロ-ルする方法。
XtNxrtGraphX、XtNxrtGraphY、XtNxrtLegendX、XtNxrtLegendYリソ-スを使用して グラフ領域と凡例の領域を指定できます。 詳細は、マニュアルの69 & 72ペ-ジを参照してください。
ヘッダ-領域を削除する方法。
XtNxrtHeaderXとXtNxrtHeaderYを負の値にセットすると、ウィンドウにはヘッダ-は表示されません。 または、XtNxrtHeaderStrings(P149)をNULLにセットすることもできます。
リソ-スをアップデ-トする度に、グラフが毎回再描画されないようにするには?
XtNxrtRepaintをFalseにセットしてから、リソ-スを設定します。その後、XtNxrtRepaintをTrueに戻して下さい。
軸やラベルに黒以外の色を指定する方法。
XtNxrtGraphForegroundColorを使用します。
多くのデ-タセットにデ-タスタイルを(短時間で)セットするには?
デ-タスタイルの配列を使用します。例えば、50個のデ-タセットには、次のようにスタイルをセットしてみてください。
#define Xcalloc(nelem, elsize) calloc(((nelem) > 0 ? (nelem) : 1), (elsize))
#define NELEM 51
...
{
XrtDataStyle **myDS= (XrtDataStyle **) Xcalloc(NELEM + 1, sizeof(XrtDataStyle *));
for(i = 0; i < NELEM; i++)
{
myDS[i] = (XrtDataStyle *) Xcalloc(1, sizeof(XrtDataStyle));
/* fill in data style here ... */
myDS[i]->lpat = XRT_LPAT_SOLID;
myDS[i]->fpat = XRT_FPAT_NONE;
myDS[i]->color = "Red";
myDS[i]->width = 1;
myDS[i]->point = XRT_POINT_NONE;
myDS[i]->pcolor = "Blue";
myDS[i]->psize = 4;
}
myDS[NELEM] = NULL; /* important! */
XtVaSetValues(graph,
XtNxrtDataStyles, myDS,
NULL);
XrtFreeDataStyles(myDS);
}
グラフをズ-ムすると、軸が表示されなくなります。
ズ-ム機能は、調整可能です。 $XRTHOME/demo/graph/にある'feedback'デモを参照して、変更してください。 このデモのソ-スコ-ドは、$XRTHOME/src/graph/demos/feedback/にあります。 デフォルトでは、軸の範囲はデ-タの範囲から計算されます。 この軸の範囲を設定し直すことにより、グラフをズ-ムすることができます。 'feedback'デモに例がありますので参考にしてください。
XrtSetNthSetLabel()を使用してラベルを設定している場合、二つのラベルだけを セットし後はNULLにしても、これらのNULLのラベルが表示されてしまいます。
XrtSetNthSetLabel()は、ラベルをNULLにしてもこれを無視してしまいます。 代りにXtVaSetValues()を使用してください。
デ-タをソ-トできますか?
XrtDataSort()が使用できます。 この関数はライブラリにありますが、ソ-スも:
$XRTHOME/src/graph/util/xrtdrtns.c.デ-タスタイルで、8番め以降はランダムになってしまいます。
デフォルトのデ-タスタイルは7個あります。 それ以上の場合、XRT/graphは、これらの7個をリサイクルして使用します。 独自のスタイルを使用する時は、各デ-タセットに対して定義してください。 独自に指定したデ-タスタイルは、デフォルトのスタイルのようにリサイクルされません。
XtNxrtData2を使用しているのに、複合グラフが作成できません。
デフォルトのXtNxrtType2はXRT_TYPE_BARです(P158)。 generalデ-タを使用している場合、棒グラフは表示されません(P15)。 グラフの種類かデ-タの種類を変更してください。
グラフ上に、線やpixmap等を描くには?
Xlibを使用してグラフ上に描画できます。 デモプログラムの'profile'に例がありますので参照してください。 プリコンパイルされたデモは、$XRTHOME/demo/graph/に、ソ-スコ-ドは$XRTHOME/src/graph/demos/profile/にあります。 (コンパイルするには、XRT/3dがインスト-ルされている必要があります。) Xlibの描画ファンクションはcontrols.cにあります。
XtNxrt[Header|Footer][Height|Width]リソ-スを変更できますか?
これらのリソ-スは変更できません。read-onlyです。
印刷
グラフを表示せずに印刷することはできますか。
XRT/graphは、グラフのサイズを決定し、フォントや色等のリソ-スを割り当てるためにXサ-バとコネクトする必要があります。 但し、グラフを画面に描画せずに出力することは可能です。 詳細は、こちらを参考にしてください。
Creating XRT/graph images for the web複数ペ-ジにまたがるグラフを印刷する方法はありますか?
このような印刷は基本機能としてはサポ-トされていませんが、少し工夫をすると実行できます。 幅のパラメ-タを、グラフの横方向の印刷に必要なペ-ジ数分の長さにセットします。 (例: 2ペ-ジの場合は17"、3ペ-ジの場合は25.5")縦方向に長いグラフは、同様にして高さのパラメ-タをセットします。 x_offsetまたはy_offsetのどちらか該当する方を使用してグラフをシフトします。 (これは各セクションまたはペ-ジ毎に行ってください。) 1ペ-ジめではoffset=0で印刷し、左または下の部分が欠けたグラフが印刷されます。
2ペ-ジめでは、offset=-nにセットします。('n'は、ペ-ジの幅/高さ)です。offsetは必ず負の値にしてください。
サンプルと例
円グラフ(テキストの貼り付け、凡例も含む)
このコ-ドとデ-タは簡単な円グラフを作成します。 またここでは、テキストを貼り付けたり、凡例を作成する例も示しています。
#include <X11/Intrinsic.h>
#include <Xm/Xm.h>
#include <Xm/XrtGraph.h>
int main(int argc, char *argv[])
{
XtAppContext app_context;
Widget graph, toplevel;
XrtData *my_data;
XrtTextDesc text;
static String textlist[] = { "here", NULL };
static char *set_labels[] = {
"aaa", "bbb", "ccc", "ddd", "eee", "fff", NULL};
/* allocate and load the data */
my_data = XrtMakeDataFromFile("pie.dat", NULL);
XtSetLanguageProc(NULL, NULL, NULL);
toplevel = XtVaAppInitialize(&app_context, "Plot 1", NULL, 0,
&argc, argv, NULL, NULL);
graph = XtVaCreateManagedWidget("mygraph",
xtXrtGraphWidgetClass, toplevel,
XtNxrtData, my_data,
XtNxrtType, XRT_TYPE_PIE,
XtNxrtSetLabels, set_labels,
XtNxrtLegendShow, True,
XtNxrtPieThresholdMethod, XRT_PIE_SLICE_CUTOFF,
XtNxrtPieThresholdValue, XrtFloatToArgVal(10.0),
XtNxrtOtherLabel, "other",
NULL);
text.position.data.type = XRT_TEXT_ATTACH_DATA;
text.position.data.dataset = 1;
text.position.data.set = XRT_OTHER_SLICE;
/* data.point specifies which graph. 0 is the first, 1 is the 2nd */
text.position.data.point = 0;
text.strings = textlist;
text.anchor = XRT_ANCHOR_HOME;
text.offset = 0;
text.connected = 0;
text.adjust = XRT_ADJUST_RIGHT;
text.fore_color = NULL;
text.back_color = "Pink";
text.border = XRT_BORDER_SHADOW;
text.border_width = 2;
text.font = NULL;
text.psfont = "Courier-BoldOblique";
(void) XrtTextCreate(graph, &text);
free((char *) text.strings);
XtRealizeWidget(toplevel);
XtAppMainLoop(app_context);
}
/* Use the following data ("pie.dat"). Note, for two pie graphs, change
ARRAY 5 1 to ARRAY 5 2 and add another column of data.*/
ARRAY 5 1
# x values -- not used
1.0
# slice values - percentage
20.0
15.0
40.0
16.0
9.0
エラ-、警告、セグメンテ-ション・フォルト
グラフ・ウィジェットが、存在しないフォントを探しているようですが.....
XmFontListは、デフォルトのフォントを使用するようにするはずですが、場合によっては、機能しないことがあります。 その場合は、リソ-スファイルに次の事項を追加してください。
*.XtXrtGraph.FontList: my-favorite-fontlist-that-I-know-will-always-be-there
アプリケ-ションを起動すると、コアダンプが起きます。
浮動小数点リソ-スでXrtFloatToArgVal()を使用しているか確認してください。
'Unexpected symbol '#' in XrtGraph.hxx'は、どういう意味ですか。
このエラ-は、使用しているコンパイラがtoken pasting macroの新しいスタイル(##)をサポ-トしておらず、代わりにtoken pastingが、/**/を要求しているために起きています。 XrtGraph.hxxでは、古いコンパイラにも対応するようにはなっていますが、対応できない部分もあります。 これを回避するには、XrtGraph.hxxを編集し、##を/**/に変更してください。