En esta página

Qt Data Visualization Tratamiento de datos

Series

Una serie es una combinación de un conjunto lógicamente conectado de elementos de datos (manejados por un proxy de datos) y propiedades visuales que describen cómo deben representarse los elementos de datos, como mallas de elementos y colores. Cada tipo de visualización tiene su propio tipo de serie. Por ejemplo, los gráficos de barras utilizan QBar3DSeries. Todos los gráficos pueden tener múltiples series añadidas simultáneamente.

Este fragmento de código muestra cómo utilizar QBar3DSeries para representar las barras como cilindros y con un degradado en lugar de un color uniforme:

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);

Datos aproximados

Los datos que los usuarios desean visualizar vienen en muchos formatos, todos los cuales obviamente no pueden ser soportados directamente. Por lo tanto, Qt Data Visualization implementa proxies de datos en los que el usuario puede introducir sus datos en un formato conocido. Cada tipo de visualización tiene un tipo de proxy básico, que toma los datos en un formato adecuado para esa visualización. Por ejemplo, el proxy básico para QBar3DSeries es QBarDataProxy, que almacena filas de objetos QBarDataItem. Cada QBarDataItem almacena un único valor de barra. Se proporcionan typedefs adicionales para los contenedores QBarDataArray y QBarDataRow.

Este fragmento de código muestra cómo utilizar el proxy básico cuando sus datos se almacenan en algún objeto myData hipotético:

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));

Nota: Los objetos serie sólo pueden poseer un único proxy a la vez. El proxy existente se elimina cuando se asigna otro a la serie. Sin embargo, los gráficos pueden contener múltiples series. Si necesita cambiar entre dos conjuntos diferentes de datos, normalmente es más eficiente almacenar cada conjunto en una serie diferente y simplemente cambiar la serie, en lugar de reiniciar los datos en un proxy cada vez que necesite cambiar.

Modelos de elementos y asignación de datos

Para casos de uso comunes, Qt Data Visualization ofrece proxies especializados. Uno de estos casos es tener datos en un modelo de elementos (QAbstractItemModel subclass), que es una forma común de almacenar datos en aplicaciones Qt. Cada uno de los tipos de visualización ofrece una clase proxy especial para este propósito, por ejemplo, QItemModelBarDataProxy para QBar3DSeries. Estos proxies son sencillos de usar: basta con darles un puntero al modelo de elementos que contiene los datos y las reglas de cómo mapear los datos en un formato que el proxy básico pueda digerir.

El mapeo funciona con roles del modelo de elementos. Cada elemento de datos del modelo puede tener distintos valores para distintos roles. Por ejemplo, con QItemModelBarDataProxy se puede especificar qué rol se utiliza para determinar a qué fila pertenece el elemento, qué rol hace lo mismo para las columnas y qué rol especifica el valor del elemento. Cuando el proxy resuelve los datos del modelo, utiliza estas asignaciones para generar las filas y columnas del gráfico de barras.

A menudo, los modelos de elementos tendrán un único rol que contiene información que se desea asignar a varios valores. Un ejemplo típico de esto es un campo de fecha y hora cuando se genera un gráfico de barras con dos ejes relacionados con el tiempo, por ejemplo años y meses. Para poder asignar un único rol de modelo de elemento a más de un campo de datos, los proxies de modelo de elemento proporcionan un mecanismo de coincidencia y sustitución de patrones. También puede utilizar este mecanismo para reformatear datos incluso en casos de asignación uno a uno.

Dependiendo del tipo de visualización, los proxies pueden soportar también otras funcionalidades, como QItemModelBarDataProxy mapeando opcionalmente QAbstractItemModel filas y columnas directamente en filas y columnas de gráficos de barras.

Consulte las clases proxy individuales para obtener más información y ejemplos sobre cómo utilizarlas: QItemModelBarDataProxy, QItemModelScatterDataProxy, y QItemModelSurfaceDataProxy.

Otros proxies personalizados

QHeightMapSurfaceDataProxy es un proxy especializado para generar un gráfico de superficie a partir de una imagen de mapa de alturas. Consulte la documentación de QHeightMapSurfaceDataProxy para obtener más información.

El ejemplo de la Galería Gráfica muestra cómo se puede crear un proxy personalizado, en la pestaña Bar Graph. Define un conjunto de datos personalizado basado en listas de variantes y una extensión del proxy básico para resolver esos datos con un mapeador asociado.

Tratamiento de datos en tiempo real

Cuando se tiene un conjunto de datos que se actualiza rápidamente, es importante manejar los datos adecuadamente para garantizar un buen rendimiento. Dado que la asignación de memoria es una operación costosa, utilice siempre que sea posible QList::reserve() y QList::resize() para evitar reasignaciones innecesarias al construir el array que se entregará al proxy. Si necesita cambiar todo el conjunto de datos para cada fotograma, en la mayoría de los casos es mejor reutilizar el array existente - especialmente si las dimensiones del array no cambian. Si necesita añadir, insertar, eliminar o cambiar varias filas o elementos para cada marco, siempre es más eficiente hacerlo con una llamada al método en lugar de múltiples llamadas que afectan a una sola fila o elemento cada una. Por ejemplo, añadir diez filas con una sola llamada a QBarDataProxy::addRows() es mucho más eficiente que diez llamadas separadas a QBarDataProxy::addRow().

El renderizador Bars está optimizado para acceder únicamente a los datos que se encuentran dentro de la ventana de datos, por lo que no debería sufrir una ralentización apreciable aunque se añadan continuamente más datos al proxy.

Debido a la naturaleza no ordenada de los datos de dispersión, cualquier cambio en los rangos de la ventana de datos requiere que se compruebe la visibilidad de todos los puntos de datos, lo que puede causar una ralentización creciente si se añaden continuamente datos al proxy. Para obtener el mejor rendimiento con los gráficos de dispersión, mantenga en el proxy sólo los datos que necesite.

Los datos de superficie, aunque a nivel de elementos son similares a los datos de dispersión, ya están asignados en filas y columnas, por lo que el renderizador de superficie puede optimizar el dibujo asumiendo que los datos en las filas y columnas están ordenados a lo largo de sus respectivos ejes. No es tan eficiente como en el caso de las barras, pero casi.

© 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.