Qt データ可視化 データハンドリング
シリーズ
シリーズは、論理的に接続されたデータ・アイテム(データ・プロキシによって処理される)と、アイテムのメッシュや色など、データ・アイテムのレンダリング方法を記述するビジュアル・プロパティの組み合わせです。それぞれの可視化タイプは、独自のシリーズタイプを持っています。例えば、棒グラフはQBar3DSeries を使用します。すべてのグラフは、複数の系列を同時に追加することができます。
このコード・スニペットは、QBar3DSeries を使用して、棒グラフを円柱として、一様な色ではなくグラデーションでレンダリングする方法を示しています:
Q3DBars graph; QBar3DSeries *series = new QBar3DSeries; QLinearGradient barGradient(0, 0, 1, 100); barGradient.setColorAt(1.0, Qt::white); barGradient.setColorAt(0.0, Qt::black); series->setBaseGradient(barGradient); series->setColorStyle(Q3DTheme::ColorStyleObjectGradient); series->setMesh(QAbstract3DSeries::MeshCylinder); graph->addSeries(series);
データ・プロキシ
ユーザが可視化したいデータは多くの形式で提供されており、そのすべてを直接サポートすることはできません。そのため、Qt Data Visualization は、ユーザが既知のフォーマットでデータを入力できるデータプロキシを実装しています。各可視化タイプには基本プロキシ・タイプがあり、その可視化に適したフォーマットのデータを受け取ります。例えば、QBar3DSeries の基本プロキシはQBarDataProxy で、QBarDataItem オブジェクトの行を格納します。各QBarDataItem は1つの小節値を格納する。QBarDataArray
とQBarDataRow
コンテナには、追加の型定義が用意されている。
このコード・スニペットは、データが仮想のmyData
オブジェクトに格納されている場合に、基本プロキシを使用する方法を示しています:
Q3DBars graph; QBarDataProxy *newProxy = new QBarDataProxy; QBarDataArray *dataArray = new QBarDataArray; dataArray->reserve(10); for (int i = 0; i < 10; i++) { QBarDataRow *dataRow = new QBarDataRow(5); for (int j = 0; j < 5; j++) (*dataRow)[j].setValue(myData->getValue(i, j)); dataArray->append(dataRow); } newProxy->resetArray(dataArray); graph->addSeries(new QBar3DSeries(newProxy));
注意: シリーズ・オブジェクトは、一度に1つのプロキシしか所有できません。別のプロキシがシリーズに設定されると、既存のプロキシは削除されます。グラフは複数の系列を含むことができます。2つの異なるデータセット間を行ったり来たりする必要がある場合、通常、切り替える必要があるたびに1つのプロキシ内のデータをリセットするのではなく、各セットを異なるシリーズに格納し、シリーズを変更するだけにした方が効率的です。
アイテムモデルとデータマッピング
一般的な使用例として、Qt Data Visualization は特殊なプロキシを提供しています。そのようなケースの一つは、アイテムモデル (QAbstractItemModel サブクラス) にデータを持つことです。これは Qt アプリケーションでデータを保存する一般的な方法です。それぞれの可視化タイプは、この目的のために特別なプロキシ・クラスを提供しています。例えば、QBar3DSeries はQItemModelBarDataProxy です。これらのプロキシは簡単に使用できます。データを含むアイテムモデルへのポインタと、データを基本プロキシが消化できる形式にマッピングするルールを与えるだけです。
マッピングはアイテムモデルのロールで動作します。モデル内の各データ項目は、異なるロールに対して異なる値を持つことができます。例えば、QItemModelBarDataProxy では、項目がどの行に属するかを決定するためにどのロールが使用され、どのロールが列に対して同じことを行い、どのロールが項目の値を指定するかを指定することができます。プロキシがモデルからデータを解決するとき、これらのマッピングを使用して棒グラフの行と列を生成します。
多くの場合、項目モデルは、複数の値にマッピングしたい情報を含む単一のロールを持ちます。この典型的な例は、例えば年月のような、時間に関連する 2 つの軸を持つ棒グラフを生成するときのタイムスタンプ・フィールドです。1つの項目モデル・ロールを複数のデータ・フィールドにマッピングできるようにするために、項目モデル・プロキシによってパターンマッチングと置換のメカニズムが提供されます。また、1対1のマッピングの場合でも、このメカニズムを使用してデータを再フォーマットすることができます。
可視化タイプによっては、プロキシはQAbstractItemModel の行と列を棒グラフの行と列に直接マッピングするQItemModelBarDataProxy オプションなど、他の機能もサポートします。
プロキシの使い方の詳細や例については、個々のプロキシクラスを参照してください:QItemModelBarDataProxy QItemModelScatterDataProxy およびQItemModelSurfaceDataProxy を参照してください。
その他のカスタムプロキシ
QHeightMapSurfaceDataProxy は、ハイトマップ画像からサーフェスグラフを生成するための特殊なプロキシです。詳細は のドキュメントを参照してください。QHeightMapSurfaceDataProxy
グラフギャラリーの例では、Bar Graph タブの下に、カスタムプロキシがどのように作成できるかを示しています。これは、バリアントリストに基づいたカスタムデータセットと、そのデータを関連するマッパーで解決するための基本プロキシの拡張を定義します。
リアルタイムデータの扱い
高速に更新されるデータセットがある場合、良いパフォーマンスを保証するためにデータを適切に扱うことが重要です。メモリの割り当てはコストのかかる操作なので、プロキシに渡す 配列を構築するときに不必要な再割り当てを避けるために、可能な限りQList::reserve() とQList::resize() を常に使用する。フレームごとにデータセット全体を変更する必要がある場合は、ほとんどの場合、既存の配列を再利用するのが最善です。各フレームに対して複数の行や項目を追加、挿入、削除、変更する必要がある場合は、1 つの行や項目に対して複数のメソッドをコールするよりも、1 つのメソッドをコールする方が常に効率的です。たとえば、QBarDataProxy::addRow ()を 10 回呼び出すよりも、QBarDataProxy::addRows ()を 1 回呼び出す方がはるかに効率的です。
Barsレンダラーは、データウィンドウ内のデータのみにアクセスするように最適化されているため、プロキシに継続的にデータが追加されても、顕著な速度低下は発生しないはずです。
スキャッターデータはソートされていないため、データウィンドウの範囲を変更すると、すべてのデータポイントの可視性をチェックする必要があります。散布図で最高のパフォーマンスを得るためには、必要なデータだけをプロキシに保持してください。
サーフェスデータは、アイテムレベルでは散布図データと似ていますが、すでに行と列に割り当てられているため、サーフェスレンダラは行と列のデータがそれぞれの軸に沿ってソートされていると仮定することで描画を最適化できます。棒グラフの場合ほど効率的ではありませんが、ほぼ同じです。
本ドキュメントに含まれる文書の著作権は、それぞれの所有者に帰属します。 本書で提供されるドキュメントは、Free Software Foundation が発行したGNU Free Documentation License version 1.3に基づいてライセンスされています。 Qtおよびそれぞれのロゴは、フィンランドおよびその他の国におけるThe Qt Company Ltd.の 商標です。その他すべての商標は、それぞれの所有者に帰属します。