Création de diagrammes en boîte et moustaches

Remarque : cet exemple fait partie de l'exemple de la galerie Charts with Widgets.

L'exemple montre également comment lire les données non continues d'un fichier, les organiser et trouver les médianes nécessaires au tracé de boîtes et de moustaches.

Capture d'écran montrant des diagrammes en boîte et des diagrammes à moustaches dans un graphique

Pour montrer l'écart entre les actions de deux entreprises, nous commençons par créer deux sites QBoxPlotSeries pour traiter les données mensuelles.

auto acmeSeries = new QBoxPlotSeries;
acmeSeries->setName("Acme Ltd");

auto boxWhiskSeries = new QBoxPlotSeries;
boxWhiskSeries->setName("BoxWhisk Inc");

QFile La classe BoxDataReader est utilisée pour ouvrir un fichier texte dans lequel les données non continues sont conservées. La classe BoxDataReader est une classe auxiliaire permettant de lire le fichier texte et de trouver les valeurs extrêmes et médianes des données. La classe BoxDataReader est expliquée plus en détail par la suite. La méthode readBox lit les valeurs et les affecte à l'élément QBoxSet que la méthode renvoie à l'appelant. L'élément QBoxSet renvoyé est ajouté à la série.

QFile acmeData(":boxplot_a");
const QString errorTemplate = QStringLiteral("Failed to load '%1' file.");
if (!acmeData.open(QIODevice::ReadOnly | QIODevice::Text)) {
    m_loadError = errorTemplate.arg(acmeData.fileName());
    return false;
}

BoxPlotDataReader dataReader(&acmeData);
while (!dataReader.atEnd()) {
    QBoxSet *set = dataReader.readBox();
    if (set)
        acmeSeries->append(set);
}

Dans cette section, un deuxième fichier est ouvert pour lire les données de la deuxième entreprise.

QFile boxwhiskData(":boxplot_b");
if (!boxwhiskData.open(QIODevice::ReadOnly | QIODevice::Text)) {
    m_loadError = errorTemplate.arg(acmeData.fileName());
    return false;
}

dataReader.readFile(&boxwhiskData);
while (!dataReader.atEnd()) {
    QBoxSet *set = dataReader.readBox();
    if (set)
        boxWhiskSeries->append(set);
}

Dans cet extrait de code, une nouvelle instance QChart est créée et les séries précédemment créées y sont ajoutées. Le titre est également défini et l'animation est définie comme étant SeriesAnimation.

auto chart = new QChart;
chart->addSeries(acmeSeries);
chart->addSeries(boxWhiskSeries);
chart->setTitle("Acme Ltd. and BoxWhisk Inc. share deviation in 2012");
chart->setAnimationOptions(QChart::SeriesAnimations);

Nous demandons ici au graphique de créer des axes par défaut pour notre présentation. Nous définissons également la plage de l'axe vertical en interrogeant le pointeur de l'axe à partir du graphique, puis en définissant les valeurs min et max de cet axe.

chart->createDefaultAxes();
chart->axes(Qt::Vertical).first()->setMin(15.0);
chart->axes(Qt::Horizontal).first()->setMax(34.0);

Dans cette section, nous définissons les légendes pour qu'elles soient visibles et nous les plaçons en bas du graphique.

chart->legend()->setVisible(true);
chart->legend()->setAlignment(Qt::AlignBottom);

Enfin, nous ajoutons le graphique à une vue. Nous activons également l'anticrénelage pour le chartView.

createDefaultChartView(chart);

Le graphique est prêt à être affiché.

La méthode readBox est expliquée en détail ici.

Tout d'abord, une ligne est lue à partir du fichier et les lignes commençant par # sont rejetées car elles sont considérées comme des lignes de commentaire.

QString line = m_textStream.readLine();
if (line.startsWith("#"))
    return nullptr;

Dans ce fichier, les données sont organisées sous forme de nombre, d'espace, de nombre ou d'espace. Dans cet extrait, la ligne est divisée en chaînes de chiffres simples qui sont stockées sur QStringList.

QStringList strList = line.split(QLatin1Char(' '), Qt::SkipEmptyParts);

La liste triée (sortedList) contiendra les nombres dans un ordre continu et dans ce segment de code, nous montrons comment procéder. Tout d'abord, la sortedList est effacée et les nombres sont lus à partir de la strList et stockés dans la sortedList au format double. La méthode qSort permet de classer la sortedList dans un ordre continu, en commençant par le plus petit.

m_sortedList.clear();
for (int i = 1; i < strList.count(); i++)
    m_sortedList.append(strList.at(i).toDouble());

std::sort(m_sortedList.begin(), m_sortedList.end());

Vous trouverez ci-dessous un exemple de code montrant comment sélectionner les extrêmes et les médianes à partir de données continues. Tout d'abord, un nouveau site QBoxSet est créé. Les extrêmes inférieurs et supérieurs sont simples à sélectionner ; il s'agit simplement du premier et du dernier élément de la liste triée. Pour les médianes, nous utilisons une méthode d'aide, findMedian, qui est expliquée plus loin. Pour la médiane de la moitié supérieure, nous devons ajuster le nombre de départ si la quantité des nombres est paire ou inégale. Le nombre final pour la moitié inférieure provient naturellement de l'arrondi.

auto box = new QBoxSet(strList.first());
box->setValue(QBoxSet::LowerExtreme, m_sortedList.first());
box->setValue(QBoxSet::UpperExtreme, m_sortedList.last());
box->setValue(QBoxSet::Median, findMedian(0, count));
box->setValue(QBoxSet::LowerQuartile, findMedian(0, count / 2));
box->setValue(QBoxSet::UpperQuartile, findMedian(count / 2 + (count % 2), count));

Vous trouverez ci-dessous un exemple de code pour la méthode findMedian. Si le nombre de chiffres est impair, nous sélectionnons le chiffre du milieu. Pour les nombres pairs, nous prenons deux nombres du milieu et calculons la valeur moyenne.

int count = end - begin;
if (count % 2) {
    return m_sortedList.at(count / 2 + begin);
} else {
    qreal right = m_sortedList.at(count / 2 + begin);
    qreal left = m_sortedList.at(count / 2 - 1 + begin);
    return (right + left) / 2.0;
}

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