Erstellen von Box-and-Whiskers-Diagrammen
Hinweis: Dies ist ein Teil des Beispiels für die Galerie Diagramme mit Widgets.
Das Beispiel zeigt auch, wie man nicht-kontinuierliche Daten aus einer Datei liest, sie anordnet und Mediane findet, die für Box-and-Whiskers-Diagramme benötigt werden.
Um die Aktienabweichung zweier Unternehmen darzustellen, erstellen wir zunächst zwei QBoxPlotSeries, um monatliche Daten zu verarbeiten.
auto acmeSeries = new QBoxPlotSeries; acmeSeries->setName("Acme Ltd"); auto boxWhiskSeries = new QBoxPlotSeries; boxWhiskSeries->setName("BoxWhisk Inc");
QFile Die Klasse BoxDataReader wird verwendet, um eine Textdatei zu öffnen, in der die nicht-kontinuierlichen Daten gespeichert sind. Die Klasse BoxDataReader ist eine Hilfsklasse zum Lesen der Textdatei und zur Ermittlung der Extrem- und Medianwerte aus den Daten. Der BoxDataReader wird später ausführlicher erklärt. Die Methode readBox liest die Werte und setzt sie in das Element QBoxSet, das die Methode für den Aufrufer zurückgibt. Das zurückgegebene Element QBoxSet wird der Reihe 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 zum Lesen der Daten für das zweite Unternehmen geöffnet.
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 Codeschnipsel wird eine neue Instanz von QChart erstellt und die zuvor erstellten Serien werden ihr hinzugefügt. Der Titel wird ebenfalls definiert und die Animation wird 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 bitten wir das Diagramm, Standardachsen für unsere Präsentation zu erstellen. Wir legen auch den Bereich für die vertikale Achse fest, indem wir den Zeiger für die Achse aus dem Diagramm abfragen und dann die Minimal- und Maximalwerte 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 legen wir fest, dass die Legenden sichtbar sein sollen und platzieren sie am unteren Rand des Diagramms.
chart->legend()->setVisible(true); chart->legend()->setAlignment(Qt::AlignBottom);
Schließlich fügen wir das Diagramm zu einer Ansicht hinzu. Wir schalten auch das Antialiasing für die chartView ein.
createDefaultChartView(chart);
Das Diagramm kann nun angezeigt werden.
Hier wird die Methode readBox im Detail erklärt.
Zunächst wird eine Zeile aus der Datei gelesen, wobei Zeilen, die mit # beginnen, verworfen werden, da sie als Kommentarzeilen betrachtet werden.
QString line = m_textStream.readLine(); if (line.startsWith("#")) return nullptr;
In dieser Datei sind die Daten als Zahl, Leerzeichen, Zahl oder Leerzeichen angeordnet. In diesem Schnipsel wird die Zeile in einzelne Zahlenstrings aufgeteilt, die auf QStringList gespeichert werden.
QStringList strList = line.split(QLatin1Char(' '), Qt::SkipEmptyParts);
Die sortedList enthält die Zahlen in fortlaufender Reihenfolge und in diesem Codesegment zeigen wir, wie man das macht. Zuerst wird die sortedList geleert und die Zahlen werden aus der strList gelesen und in der sortedList im Double-Format gespeichert. Die Methode qSort ordnet die sortedList in fortlaufender Reihenfolge, beginnend mit der kleinsten Zahl.
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 die Extremwerte und Mediane aus den kontinuierlichen Daten ausgewählt werden. Zunächst wird eine neue QBoxSet erstellt. Untere und obere Extremwerte sind einfach auszuwählen; sie sind einfach die ersten und letzten Elemente in der sortierten Liste. Für Mediane verwenden wir eine Hilfsmethode findMedian, die später erklärt wird. Für den Median der oberen Hälfte müssen wir die Anfangszahl anpassen, wenn die Anzahl der Zahlen gerade oder ungerade ist. Die Endzahl für die untere Hälfte ergibt sich natürlich 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 Codebeispiel für die Methode findMedian. Wenn die Anzahl der Zahlen ungerade ist, wählen wir die Zahl in der Mitte. Bei gerader Anzahl von Zahlen nehmen wir zwei Zahlen aus der Mitte und berechnen den Mittelwert.
© 2025 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.