이 페이지에서

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은 하나의 막대 값을 저장합니다. 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 객체는 한 번에 하나의 프록시만 가질 수 있습니다. 시리즈에 다른 프록시가 설정되면 기존 프록시는 삭제됩니다. 하지만 그래프에는 여러 개의 시리즈를 포함할 수 있습니다. 두 개의 서로 다른 데이터 세트 간에 전환해야 하는 경우, 전환할 때마다 하나의 프록시에 있는 데이터를 재설정하는 것보다 각 세트를 서로 다른 시리즈에 저장하고 시리즈만 변경하는 것이 일반적으로 더 효율적입니다.

항목 모델 및 데이터 매핑

일반적인 사용 사례를 위해 Qt Data Visualization 는 특화된 프록시를 제공합니다. 그 중 하나는 Qt 애플리케이션에서 데이터를 저장하는 일반적인 방식인, 아이템 모델(QAbstractItemModel 의 서브클래스)에 데이터를 포함하는 경우입니다. 각 시각화 유형은 이러한 목적을 위해 특수한 프록시 클래스를 제공합니다. 예를 들어, QBar3DSeries의 경우 QItemModelBarDataProxy가 있습니다. 이러한 프록시는 사용법이 간단합니다. 데이터를 포함하는 아이템 모델에 대한 포인터와, 데이터를 기본 프록시가 처리할 수 있는 형식으로 매핑하는 규칙만 지정하면 됩니다.

매핑은 항목 모델의 역할(role)을 통해 이루어집니다. 모델 내의 각 데이터 항목은 역할에 따라 서로 다른 값을 가질 수 있습니다. 예를 들어, QItemModelBarDataProxy를 사용하면 항목이 속한 행을 결정하는 데 어떤 역할을 사용할지, 열을 결정하는 데 어떤 역할을 사용할지, 그리고 항목의 값을 지정하는 데 어떤 역할을 사용할지 지정할 수 있습니다. 프록시가 모델에서 데이터를 처리할 때, 이러한 매핑을 사용하여 막대 그래프의 행과 열을 생성합니다.

종종 항목 모델에는 여러 값에 매핑하고자 하는 정보를 포함하는 단일 역할이 있습니다. 이에 대한 전형적인 예로는, 연도와 월과 같이 두 개의 시간 관련 축을 사용하는 막대 그래프를 생성할 때의 타임스탬프 필드가 있습니다. 단일 항목 모델 역할을 두 개 이상의 데이터 필드에 매핑할 수 있도록, 항목 모델 프록시는 패턴 매칭 및 치환 메커니즘을 제공합니다. 또한 이 메커니즘을 사용하여 일대일 매핑의 경우에도 데이터 형식을 재구성할 수 있습니다.

시각화 유형에 따라 프록시는 다른 기능도 지원할 수 있습니다. 예를 들어, QItemModelBarDataProxy는 선택적으로 ‘ QAbstractItemModel ’의 행과 열을 막대 그래프의 행과 열에 직접 매핑할 수 있습니다.

사용 방법에 대한 자세한 정보와 예제는 개별 프록시 클래스(QItemModelBarDataProxy, QItemModelScatterDataProxy, QItemModelSurfaceDataProxy)를 참조하십시오.

기타 사용자 정의 프록시

QHeightMapSurfaceDataProxy는 하이트맵 이미지에서 표면 그래프를 생성하기 위한 특수화된 프록시입니다. 자세한 내용은 QHeightMapSurfaceDataProxy 문서를 참조하십시오.

Graph Gallery 예제에서는 ‘ Bar Graph ’ 탭에서 사용자 정의 프록시를 생성하는 방법을 보여줍니다. 이 예제는 변형 목록을 기반으로 사용자 정의 데이터 세트를 정의하고, 기본 프록시를 확장하여 해당 데이터를 관련 매퍼로 변환합니다.

실시간 데이터 처리

데이터 세트가 빠르게 업데이트되는 경우, 우수한 성능을 보장하기 위해 데이터를 적절히 처리하는 것이 중요합니다. 메모리 할당은 비용이 많이 드는 작업이므로, 프록시에 전달할 배열을 생성할 때 불필요한 재할당을 피하기 위해 가능한 한 항상 ` QList::reserve()` 및 ` QList::resize()`를 사용하십시오. 프레임마다 전체 데이터 세트를 변경해야 하는 경우, 특히 배열의 차원이 변경되지 않는다면 대부분의 경우 기존 배열을 재사용하는 것이 가장 좋습니다. 프레임마다 여러 행이나 항목을 추가, 삽입, 제거 또는 변경해야 하는 경우, 행이나 항목 하나씩을 처리하는 여러 번의 호출 대신 하나의 메서드 호출로 처리하는 것이 항상 더 효율적입니다. 예를 들어, QBarDataProxy::addRows()를 한 번 호출하여 10개의 행을 추가하는 것이, QBarDataProxy::addRow()를 10번 별도로 호출하는 것보다 훨씬 더 효율적입니다.

막대형 렌더러는 데이터 윈도우 내에 있는 데이터에만 접근하도록 최적화되어 있으므로, 프록시에 더 많은 데이터가 지속적으로 추가되더라도 눈에 띄는 속도 저하는 발생하지 않습니다.

산점도 데이터는 정렬되지 않은 특성상, 데이터 윈도우 범위가 변경될 때마다 모든 데이터 포인트의 표시 여부를 확인해야 하므로, 프록시에 데이터가 지속적으로 추가될 경우 성능 저하가 점차 심해질 수 있습니다. 산점도 그래프에서 최상의 성능을 얻으려면 프록시에 필요한 데이터만 유지하십시오.

표면 데이터는 항목 수준에서는 산점도 데이터와 유사하지만, 이미 행과 열로 할당되어 있으므로 표면 렌더러는 행과 열의 데이터가 각 축을 따라 정렬되어 있다고 가정하여 그리기 작업을 최적화할 수 있습니다. 막대 그래프의 경우만큼 효율적이지는 않지만, 거의 비슷한 수준입니다.

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