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 数据可视化实现数据代理,用户可以将他们的数据以已知格式输入到代理中。每种可视化类型都有一个基本的代理类型,该类型接收适合该可视化格式的数据。例如,QBar3DSeries的基本代理是QBarDataProxy,它存储QBarDataItem对象的行。每个QBarDataItem存储单个条形图的值。为;code translate="no">QBarDataArray;code translate="no">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));

注意:系列对象一次只能拥有一个代理。将另一个代理设置为系列时,现有代理将被删除。尽管如此,图表可以包含多个系列。如果您需要在不同数据集之间切换,通常更有效的方法是在一个系列中存储每个数据集,并仅更改系列,而不是每次需要切换时重置一个代理中的数据。

项目模型和数据映射

对于通用用例,Qt 数据可视化提供特定的代理。此类情况之一是将数据存储在项目模型(QAbstractItemModel子类)中,这是在 Qt 应用程序中存储数据的常用方法。每种可视化类型都为此目的提供了一个特定的代理类,例如,为QBar3DSeries提供了QItemModelBarDataProxy。这些代理易于使用:只需为它们提供一个包含数据的项模型指针以及将数据映射到基本代理可以解析的格式的规则即可。

映射与项目模型角色协同工作。模型中的每个数据项可以为不同的角色拥有不同的值。例如,使用QItemModelBarDataProxy,您可以指定用于确定项目属于哪一行的角色,哪个角色用于列,以及哪个角色指定项目的值。当代理从模型解析数据时,它使用这些映射来生成柱状图的行和列。

通常项目模型将只有一个包含您想要映射到多个值的角色。典型例子是在使用两个与时间相关的轴(例如,年份和月份)生成柱状图时的时间戳字段。为了使单个项目模型角色映射到多个数据字段,Item模型代理提供了模式匹配和替换机制。您也可以使用此机制在一对一映射情况下重新格式化数据。

根据可视化类型,代理可能还支持其他功能,例如QItemModelBarDataProxy可选地将QAbstractItemModel的行和列直接映射到柱状图的行和列。

有关单独代理类及其使用方法的信息和示例,请参见:QItemModelBarDataProxyQItemModelScatterDataProxyQItemModelSurfaceDataProxy

其他自定义代理

QHeightMapSurfaceDataProxy是一个用于从高度图图像生成表面图的专用代理。有关更多信息,请参阅QHeightMapSurfaceDataProxy文档。

Graph Gallery示例显示了如何在,“柱状图”选项卡下创建自定义代理。它定义了一个基于变量列表的自定义数据集,并将基本代理扩展以通过相关映射器处理数据。

处理实时数据

当您有一个快速更新的数据集时,正确处理数据很重要,以保证良好的性能。由于内存分配是一项昂贵的操作,因此在可能的情况下始终使用QList::reserve()和QList::resize(),以避免在向代理提供数组构建时进行不必要的重新分配。如果您需要为每个帧更改整个数据集,在大多数情况下最好重用现有数组 - 尤其是在数组维度不改变的情况下。如果您需要为每个帧添加、插入、删除或更改多个行或项目,则始终用单个方法调用执行它们,比每个调用影响单个行或项目更有效率。例如,用单个QBarDataProxy::addRows()调用添加十个行比十个单独的QBarDataProxy::addRow()调用更有效。

Bar渲染器已优化,仅访问数据窗口内的数据,因此即使不断向代理添加更多数据,也不会出现显著的减速。

由于散点数据的不排序性质,数据窗口范围上的任何变化都会要求检查所有数据点以确定其可见性,这可能会在向代理持续添加数据时导致逐渐的减速。要获得散点图的最佳性能,仅保留代理中的所需数据。

表面数据,尽管在项目级别与散点数据类似,但已经指定到行和列中,因此表面渲染器可以通过假设行和列中的数据沿其各自轴排序来优化绘制。它不如柱状图情况那样高效,但几乎一样。

© 2024 Qt公司有限公司。此处包含的文档贡献权属于其各自所有者。此处提供的文档根据由自由软件基金会发布的GNU自由文档许可证第1.3版授权。Qt及其相关标志为芬兰及其他国家/地区的Qt公司商标。商标。所有其他商标均为其各自所有者的财产。