このページでは

Qt Data Visualization データの取り扱い

シリーズ

シリーズとは、(データプロキシによって処理される)論理的に関連付けられたデータ項目の集合と、アイテムのメッシュや色など、データ項目をどのようにレンダリングすべきかを記述する視覚的プロパティとの組み合わせです。各可視化タイプには、それぞれ固有のシリーズタイプがあります。たとえば、棒グラフでは 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 コンテナ用には、追加のtypedefが提供されています。

以下のコードスニペットは、データが架空の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));

注:Series オブジェクトは、一度に1つのプロキシしか保持できません。シリーズに別のプロキシが設定されると、既存のプロキシは削除されます。ただし、グラフには複数のシリーズを含めることができます。 2つの異なるデータセットを切り替える必要がある場合、切り替えのたびに1つのプロキシ内のデータをリセットするよりも、各セットを別々のシリーズに保存し、シリーズを切り替える方が通常は効率的です。

アイテムモデルとデータマッピング

一般的なユースケースに対応するため、Qt Data Visualization は専用のプロキシを提供しています。その一例として、アイテムモデル(QAbstractItemModel のサブクラス)にデータを保持する場合が挙げられます。これは、Qtアプリケーションでデータを保存する一般的な方法です。 各可視化タイプには、この目的のための特別なプロキシクラスが用意されています。例えば、QBar3DSeries には QItemModelBarDataProxy があります。これらのプロキシの使用方法は簡単です。データを含むアイテムモデルへのポインタと、データを基本プロキシが処理できる形式にマッピングするためのルールを指定するだけです。

マッピングは、アイテムモデルのロールに基づいて行われます。モデル内の各データ項目は、ロールごとに異なる値を持つことができます。 たとえば、`QItemModelBarDataProxy` を使用する場合、アイテムがどの行に属するかを決定するためにどのロールを使用するか、列についてはどのロールを使用するか、そしてアイテムの値を指定するロールを指定できます。プロキシがモデルからデータを解析する際、これらのマッピングを使用して棒グラフの行と列を生成します。

多くの場合、アイテムモデルには、複数の値にマッピングしたい情報を含む単一のロールが存在します。この典型的な例として、年や月といった2つの時間軸を持つ棒グラフを生成する際のタイムスタンプフィールドが挙げられます。 単一のアイテムモデル・ロールを複数のデータフィールドにマッピングできるようにするため、アイテムモデル・プロキシではパターンマッチングおよび置換の仕組みが提供されています。この仕組みは、1対1のマッピングの場合であっても、データの再フォーマットに使用できます。

可視化の種類によっては、プロキシが他の機能もサポートする場合があります。例えば、QItemModelBarDataProxyは、QAbstractItemModel の行と列を棒グラフの行と列に直接マッピングするオプション機能を提供しています。

詳細および使用例については、個々のプロキシクラス(QItemModelBarDataProxy、QItemModelScatterDataProxy、QItemModelSurfaceDataProxy)を参照してください。

その他のカスタムプロキシ

QHeightMapSurfaceDataProxy は、ハイトマップ画像からサーフェスグラフを生成するための特殊なプロキシです。詳細については、QHeightMapSurfaceDataProxy のドキュメントを参照してください。

「Graph Gallery」サンプルでは、「Bar Graph 」タブで、カスタムプロキシの作成方法を示しています。このサンプルでは、バリアントリストに基づいたカスタムデータセットと、関連するマッパーを使用してそのデータを解決するための基本プロキシの拡張を定義しています。

リアルタイムデータの取り扱い

データセットが急速に更新される場合、良好なパフォーマンスを確保するためにデータを適切に処理することが重要です。メモリの割り当ては負荷の高い操作であるため、プロキシに渡す配列を構築する際に不必要な再割り当てを避けるため、可能な限り常に `QList::reserve()` および `QList::resize()` を使用してください。 フレームごとにデータセット全体を変更する必要がある場合、特に配列の次元が変わらない場合は、ほとんどの場合、既存の配列を再利用するのが最善です。 各フレームごとに複数の行や項目を追加、挿入、削除、または変更する必要がある場合は、1行または1項目ごとに個別のメソッド呼び出しを行うよりも、1回のメソッド呼び出しで行う方が常に効率的です。たとえば、10行を追加する場合、QBarDataProxy::addRows() を1回呼び出す方が、QBarDataProxy::addRow() を10回個別に呼び出すよりもはるかに効率的です。

Barsレンダラーは、データウィンドウ内のデータにのみアクセスするように最適化されているため、プロキシにデータが継続的に追加されても、目立った速度低下は生じないはずです。

スキャッターデータはソートされていないため、データウィンドウの範囲を変更するたびに、すべてのデータポイントの可視性を確認する必要があります。これにより、プロキシにデータが継続的に追加されると、パフォーマンスの低下が徐々に進行する可能性があります。スキャッターグラフで最高のパフォーマンスを得るには、必要なデータのみをプロキシに保持してください。

サーフェスデータは、項目レベルでは散布図データと似ていますが、すでに列と行に割り当てられているため、サーフェスレンダラーは、列と行のデータがそれぞれの軸に沿ってソートされていると仮定することで、描画を最適化できます。バーの場合ほど効率的ではありませんが、それに近い効率が得られます。

© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.