Création de diagrammes en boîte à moustaches

Remarque : cet exemple fait partie de la galerie « Graphiques avec widgets ».

Cet exemple montre également comment lire des données non continues à partir d'un fichier, les organiser et déterminer les médianes nécessaires à la création d'un diagramme en boîte à moustaches.

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

Pour illustrer l'écart entre les cours boursiers de deux sociétés, nous commençons par créer deux objets `QBoxPlotSeries` destinés à traiter les données mensuelles.

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

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

QFile La classe est utilisée pour ouvrir un fichier texte contenant les données non continues. La classe `BoxDataReader` est une classe auxiliaire permettant de lire le fichier texte et de déterminer les valeurs extrêmes et médianes à partir 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 attribue à 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 de 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 configurée sur 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);

Ici, nous demandons au graphique de créer des axes par défaut pour notre présentation. Nous définissons également l’intervalle de l’axe vertical en interrogeant le pointeur de l’axe à partir du graphique, puis en définissant les valeurs minimale et maximale 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 rendons les légendes visibles et les plaçons au 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 la vue du graphique.

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 la forme « nombre, espace, nombre » ou « espace ». Dans cet extrait de code, la ligne est divisée en chaînes de caractères contenant un seul nombre, qui sont stockées dans ` QStringList`.

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

La `sortedList` contiendra les nombres dans un ordre continu et, dans cet extrait de code, nous montrons comment procéder. Tout d’abord, la `sortedList` est vidée, puis les nombres sont lus à partir de la `strList` et stockés dans la `sortedList` au format double. La méthode `qSort` organise 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 illustrant comment sélectionner les valeurs extrêmes et les médianes à partir de données continues. Tout d’abord, un nouveau `QBoxSet` est créé. Les valeurs extrêmes inférieure et supérieure sont faciles à sélectionner : il s’agit simplement du premier et du dernier élément de la `sortedList`. Pour les médianes, nous utilisons une méthode d’aide `findMedian`, qui sera expliquée plus loin. Pour la médiane de la moitié supérieure, nous devons ajuster le nombre de départ selon que le nombre d’éléments est pair ou impair. Le nombre de fin pour la moitié inférieure découle naturellement de l’arrondi des entiers.

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 l’exemple de code correspondant à la méthode `findMedian`. Si le nombre d’éléments est impair, nous sélectionnons l’élément situé au milieu. Si le nombre d’éléments est pair, nous prenons deux éléments situés au milieu et calculons leur 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.