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つの小節値を格納する。QBarDataArrayQBarDataRow コンテナには、追加の型定義が用意されている。

このコード・スニペットは、データが仮想の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 アプリケーションでデータを保存する一般的な方法です。それぞれの可視化タイプは、この目的のために特別なプロキシ・クラスを提供しています。例えば、QBar3DSeriesQItemModelBarDataProxy です。これらのプロキシは簡単に使用できます。データを含むアイテムモデルへのポインタと、データを基本プロキシが消化できる形式にマッピングするルールを与えるだけです。

マッピングはアイテムモデルのロールで動作します。モデル内の各データ項目は、異なるロールに対して異なる値を持つことができます。例えば、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.の 商標です。その他すべての商標は、それぞれの所有者に帰属します。