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を編集し、##を/**/に変更してください。