一、QCPStatisticalBox 概述
QCPStatisticalBox 是 QCustomPlot 中用于繪制箱線圖(盒須圖)的類,可以顯示數據的五個關鍵統計量:最小值、第一四分位數(Q1)、中位數、第三四分位數(Q3)和最大值,以及可能的異常值。
二、主要屬性
屬性 | 類型 | 描述 |
---|---|---|
width | double | 箱體的寬度(坐標軸單位) |
whiskerWidth | double | 須線的寬度(0-1表示比例) |
pen | QPen | 箱線和須線的畫筆屬性 |
brush | QBrush | 箱體填充的畫刷屬性 |
whiskerPen | QPen | 須線的畫筆屬性 |
medianPen | QPen | 中位線的畫筆屬性 |
outlierStyle | QCPScatterStyle | 異常值的散點樣式 |
name | QString | 箱線圖名稱(顯示在圖例中) |
visible | bool | 是否可見 |
selectable | bool | 是否可選擇 |
selected | bool | 當前是否被選中 |
三、常用方法
1. 數據相關方法
方法 | 參數 | 返回值 | 描述 |
---|---|---|---|
setData | double key, double minimum, double lowerQuartile, double median, double upperQuartile, double maximum | void | 設置單個箱線圖數據 |
setData | const QVector<double>& keys, const QVector<double>& minimums, const QVector<double>& lowerQuartiles, const QVector<double>& medians, const QVector<double>& upperQuartiles, const QVector<double>& maximums | void | 設置多個箱線圖數據 |
addData | double key, double minimum, double lowerQuartile, double median, double upperQuartile, double maximum | void | 添加單個箱線圖 |
addData | const QVector<double>& keys, const QVector<double>& minimums, const QVector<double>& lowerQuartiles, const QVector<double>& medians, const QVector<double>& upperQuartiles, const QVector<double>& maximums | void | 添加多個箱線圖 |
setOutliers | double key, const QVector<double>& outliers | void | 設置指定key的異常值 |
addOutliers | double key, const QVector<double>& outliers | void | 添加異常值 |
2. 樣式設置方法
方法 | 參數 | 返回值 | 描述 |
---|---|---|---|
setWidth | double width | void | 設置箱體寬度 |
setWhiskerWidth | double width | void | 設置須線寬度比例 |
setPen | const QPen &pen | void | 設置箱線畫筆 |
setBrush | const QBrush &brush | void | 設置箱體填充畫刷 |
setWhiskerPen | const QPen &pen | void | 設置須線畫筆 |
setMedianPen | const QPen &pen | void | 設置中位線畫筆 |
setOutlierStyle | const QCPScatterStyle &style | void | 設置異常值樣式 |
3. 交互相關方法
方法 | 參數 | 返回值 | 描述 |
---|---|---|---|
setSelectable | QCP::SelectionType selectable | void | 設置可選擇類型 |
setSelection | QCPDataSelection selection | void | 設置選中項 |
selected | - | QCPDataSelection | 獲取選中項 |
selectTest | const QPointF &pos, bool onlySelectable, QVariant *details | double | 測試點是否選中 |
四、信號列表
信號 | 參數 | 描述 |
---|---|---|
selectionChanged | bool selected | 選中狀態改變時觸發 |
selectableChanged | QCP::SelectionType selectable | 可選擇狀態改變時觸發 |
五、基礎使用示例
cpp
// 創建箱線圖
QCPStatisticalBox *statBox = new QCPStatisticalBox(customPlot->xAxis, customPlot->yAxis);// 設置單個箱線圖數據 (key, 最小值, Q1, 中位數, Q3, 最大值)
statBox->setData(1, 3.0, 4.5, 5.8, 7.2, 9.0);// 添加異常值
statBox->addOutliers(1, {2.1, 9.5, 10.2});// 設置樣式
statBox->setName("數據分布");
statBox->setWidth(0.3);
statBox->setBrush(QColor(100, 150, 250, 100));
statBox->setMedianPen(QPen(Qt::red, 2));
statBox->setWhiskerWidth(0.2);// 設置坐標軸范圍
customPlot->xAxis->setRange(0, 2);
customPlot->yAxis->setRange(0, 12);// 刷新顯示
customPlot->replot();
六、高級功能示例
1. 多組箱線圖比較
cpp
// 創建第一組箱線圖
QCPStatisticalBox *statBox1 = new QCPStatisticalBox(customPlot->xAxis, customPlot->yAxis);
statBox1->setData(1, 3.0, 4.5, 5.8, 7.2, 9.0);
statBox1->addOutliers(1, {2.1, 9.5});
statBox1->setName("組A");
statBox1->setWidth(0.3);
statBox1->setBrush(QColor(100, 150, 250, 100));// 創建第二組箱線圖
QCPStatisticalBox *statBox2 = new QCPStatisticalBox(customPlot->xAxis, customPlot->yAxis);
statBox2->setData(2, 2.5, 5.0, 6.5, 8.0, 10.0);
statBox2->addOutliers(2, {1.8, 10.5});
statBox2->setName("組B");
statBox2->setWidth(0.3);
statBox2->setBrush(QColor(250, 150, 100, 100));// 設置坐標軸
customPlot->xAxis->setRange(0, 3);
customPlot->yAxis->setRange(0, 12);
2. 自定義選擇樣式
cpp
statBox->setSelectable(QCP::stWhole); // 允許選擇整個箱線圖
statBox->setSelectedBrush(QBrush(QColor(255, 100, 100, 150)));
statBox->setSelectedPen(QPen(Qt::red, 2));// 連接選擇信號
connect(customPlot, &QCustomPlot::selectionChangedByUser, [=](){if (statBox->selected()) {qDebug() << "箱線圖被選中";}
});
3. 從實際數據計算統計量
cpp
// 計算統計量的輔助函數
void calculateStatistics(const QVector<double> &data, double &min, double &q1, double &median, double &q3, double &max, QVector<double> &outliers)
{QVector<double> sorted = data;std::sort(sorted.begin(), sorted.end());int n = sorted.size();min = sorted.first();max = sorted.last();// 計算四分位數q1 = sorted.at(n*1/4);median = sorted.at(n/2);q3 = sorted.at(n*3/4);// 計算異常值(使用1.5IQR規則)double iqr = q3 - q1;double lowerBound = q1 - 1.5*iqr;double upperBound = q3 + 1.5*iqr;for (double val : data) {if (val < lowerBound || val > upperBound) {outliers.append(val);}}
}// 使用示例
QVector<double> dataset = { /* 你的數據 */ };
double min, q1, median, q3, max;
QVector<double> outliers;
calculateStatistics(dataset, min, q1, median, q3, max, outliers);statBox->setData(1, min, q1, median, q3, max);
statBox->setOutliers(1, outliers);
七、箱線圖各部分的含義
Q75:上四分位數
Q25:下四分位數
須線(whisker)
箱體(interquartile range)
八、性能優化技巧
-
批量設置數據:
cpp
// 使用vector批量設置數據比多次調用addData更高效 QVector<double> keys = {1, 2, 3}; QVector<double> mins = {3.0, 2.5, 3.2}; // ...其他統計量向量 statBox->setData(keys, mins, q1s, medians, q3s, maxs);
-
簡化繪制:
cpp
statBox->setAntialiased(false); // 關閉抗鋸齒提高性能
-
使用OpenGL加速:
cpp
customPlot->setOpenGl(true);
QCPStatisticalBox 提供了完整的箱線圖功能,可以有效地展示數據的分布特征和異常值,特別適用于統計分析和數據比較場景。