Erstellen von Box-and-Whiskers-Diagrammen

Hinweis: Dies ist Teil des Beispiels „Diagramme mit Widgets “ in der Galerie.

Das Beispiel zeigt außerdem, wie man diskrete Daten aus einer Datei liest, aufbereitet und die für die Erstellung von Box-and-Whiskers-Diagrammen erforderlichen Mediane ermittelt.

Screenshot, der Box- und Whisker-Diagramme in einem Diagramm zeigt

Um die Kursabweichung zweier Unternehmen darzustellen, erstellen wir zunächst zwei „QBoxPlotSeries“-Objekte zur Verarbeitung der monatlichen Daten.

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

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

QFile Die Klasse „BoxDataReader“ dient zum Öffnen einer Textdatei, in der die diskreten Daten gespeichert sind. Der „BoxDataReader“ ist eine Hilfsklasse zum Einlesen der Textdatei und zum Ermitteln der Extrem- und Medianwerte aus den Daten. Der „BoxDataReader“ wird später noch ausführlicher erläutert. Die Methode „readBox“ liest die Werte ein und weist sie dem „QBoxSet“-Element zu, das die Methode an den Aufrufer zurückgibt. Das zurückgegebene „QBoxSet“-Element wird der Serie hinzugefügt.

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

In diesem Abschnitt wird eine zweite Datei geöffnet, um die Daten für das zweite Unternehmen einzulesen.

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

In diesem Codeausschnitt wird eine neue „QChart“-Instanz erstellt und zuvor erstellte Reihen werden ihr hinzugefügt. Außerdem wird der Titel definiert und die Animation auf „SeriesAnimation“ gesetzt.

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

Hier weisen wir das Diagramm an, Standardachsen für unsere Darstellung zu erstellen. Außerdem legen wir den Bereich für die vertikale Achse fest, indem wir den Zeiger für die Achse vom Diagramm abfragen und anschließend den Minimal- und Maximalwert für diese Achse festlegen.

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

In diesem Abschnitt machen wir die Legenden sichtbar und platzieren sie am unteren Rand des Diagramms.

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

Abschließend fügen wir das Diagramm einer Ansicht hinzu. Außerdem aktivieren wir die Kantenglättung für die „chartView“.

createDefaultChartView(chart);

Das Diagramm ist nun bereit zur Anzeige.

Hier wird die Methode `readBox` ausführlich erläutert.

Zunächst wird eine Zeile aus der Datei gelesen, wobei Zeilen, die mit # beginnen, verworfen werden, da sie als Kommentarzeilen gelten.

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

In dieser Datei sind die Daten im Format „Zahl, Leerzeichen, Zahl“ oder „Zahl, Leerzeichen“ angeordnet. In diesem Codeausschnitt wird die Zeile in einzelne Zahlenzeichenfolgen aufgeteilt, die in ` QStringList` gespeichert werden.

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

Die `sortedList` enthält die Zahlen in fortlaufender Reihenfolge, und in diesem Codeausschnitt zeigen wir, wie dies umgesetzt wird. Zunächst wird die `sortedList` geleert, und die Zahlen werden aus der `strList` eingelesen und im Double-Format in der `sortedList` gespeichert. Die Methode `qSort` ordnet die `sortedList` in fortlaufender Reihenfolge, beginnend mit dem kleinsten Wert.

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

Im Folgenden finden Sie ein Codebeispiel, das zeigt, wie man Extremwerte und Mediane aus den fortlaufenden Daten auswählt. Zunächst wird ein neues `QBoxSet` erstellt. Der untere und der obere Extremwert lassen sich einfach auswählen; es handelt sich dabei lediglich um das erste bzw. letzte Element der `sortedList`. Für Mediane verwenden wir eine Hilfsmethode namens `findMedian`, die später erläutert wird. Für den Median der oberen Hälfte müssen wir die Startzahl anpassen, je nachdem, ob die Anzahl der Zahlen gerade oder ungerade ist. Die Endzahl für die untere Hälfte ergibt sich automatisch aus der int-Rundung.

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

Nachfolgend finden Sie das Code-Beispiel für die Methode „findMedian“. Bei einer ungeraden Anzahl von Zahlen wählen wir die Zahl aus der Mitte aus. Bei einer geraden Anzahl von Zahlen nehmen wir zwei Zahlen aus der Mitte und berechnen den Mittelwert.

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.