给我一段c++结合qt的代码,利用qcutomplot实现对一组一维数据的频率直方图绘制
时间: 2024-04-16 07:28:47 浏览: 106
当然可以!以下是一个示例代码,演示了如何使用 Qt 和 QCustomPlot 绘制一组一维数据的频率直方图:
```cpp
#include <QApplication>
#include <QVector>
#include "qcustomplot.h"
int main(int argc, char *argv[]) {
QApplication a(argc, argv);
// 生成一组随机数据
QVector<double> data;
for (int i = 0; i < 1000; ++i) {
double value = qrand() % 100; // 生成 0 到 99 之间的随机数
data.append(value);
}
// 创建直方图
QCustomPlot plot;
plot.setWindowTitle("Frequency Histogram");
plot.setFixedSize(800, 600);
// 创建并设置直方图数据
QCPBars *histogram = new QCPBars(plot.xAxis, plot.yAxis);
histogram->setData(QVector<double>(), QVector<double>());
histogram->setWidth(1.0); // 设置直方图的宽度
// 统计频率
QVector<double> bins; // 存储直方图的分组边界
QVector<double> frequencies; // 存储每个分组的频率
double binWidth = 10.0; // 每个分组的宽度
for (double binStart = 0.0; binStart < 100.0; binStart += binWidth) {
double binEnd = binStart + binWidth;
double frequency = 0;
for (const auto& value : data) {
if (value >= binStart && value < binEnd) {
frequency++;
}
}
bins.append(binStart);
frequencies.append(frequency);
}
// 设置直方图的数据
histogram->setData(bins, frequencies);
// 设置绘图区域的范围
plot.xAxis->setRange(0, 100);
plot.yAxis->setRange(0, *std::max_element(frequencies.constBegin(), frequencies.constEnd()));
// 显示直方图
plot.show();
return a.exec();
}
```
上述代码中,我们使用了 Qt 库和 QCustomPlot 组件。首先,我们生成了一组随机数据,并存储在 QVector 中。然后,我们创建了一个 QCustomPlot 对象,并设置窗口标题和大小。接下来,我们创建了一个 QCPBars 对象来表示直方图,并设置直方图的宽度。然后,我们使用循环遍历数据并统计每个分组的频率,并将分组边界和频率存储在相应的 QVector 中。最后,我们使用 `setData` 函数将数据设置给直方图,并设置绘图区域的范围。最后,我们显示了绘制好的直方图。
请确保已经正确配置了 Qt 和 QCustomPlot,并将其相关头文件和库文件包含在项目中。
阅读全文