一、QCPColorMap 概述
QCPColorMap 是 QCustomPlot 中用于绘制二维颜色图的类,可以将矩阵数据可视化为颜色图(热力图),支持自定义色标和插值方式。
二、主要属性
属性 | 类型 | 描述 |
---|---|---|
data | QCPColorMapData | 存储颜色图数据的对象 |
interpolate | bool | 是否启用像素插值 |
tightBoundary | bool | 是否紧密贴合数据边界 |
colorScale | QCPColorScale* | 关联的色标 |
gradient | QCPColorGradient | 使用的颜色渐变 |
name | QString | 颜色图名称 |
visible | bool | 是否可见 |
selectable | bool | 是否可选择 |
selected | bool | 当前是否被选中 |
色渐变QCPColorGradient,它决定了颜色图的数据对应的是什么颜色,QCPColorGradient预定义了9种颜色渐变,如下图所示:
三、常用方法
1. 数据相关方法
方法 | 参数 | 返回值 | 描述 |
---|---|---|---|
setData | QCPColorMapData *data | void | 设置数据对象 |
data | - | QCPColorMapData* | 获取数据对象 |
updateColors | - | void | 强制更新颜色 |
rescaleDataRange | bool recalculateDataBounds | void | 重新缩放数据范围 |
2. 样式设置方法
方法 | 参数 | 返回值 | 描述 |
---|---|---|---|
setInterpolate | bool enabled | void | 设置是否插值 |
setTightBoundary | bool enabled | void | 设置紧密边界 |
setColorScale | QCPColorScale *colorScale | void | 设置关联色标 |
setGradient | const QCPColorGradient &gradient | void | 设置颜色渐变 |
setSelectedPen | const QPen &pen | void | 设置选中边框画笔 |
setSelectedBrush | const QBrush &brush | void | 设置选中填充画刷 |
3. 交互相关方法
方法 | 参数 | 返回值 | 描述 |
---|---|---|---|
setSelectable | QCP::SelectionType selectable | void | 设置可选择类型 |
selectTest | const QPointF &pos, bool onlySelectable, QVariant *details | double | 测试点是否选中 |
四、信号
信号 | 参数 | 描述 |
---|---|---|
selectionChanged | bool selected | 选中状态改变时触发 |
selectableChanged | QCP::SelectionType selectable | 可选择状态改变时触发 |
五、基础使用示例
cpp
// 创建颜色图
QCPColorMap *colorMap = new QCPColorMap(customPlot->xAxis, customPlot->yAxis);// 设置数据维度 (nx, ny)
int nx = 200;
int ny = 200;
colorMap->data()->setSize(nx, ny);// 设置数据范围
colorMap->data()->setRange(QCPRange(0, 10), QCPRange(0, 10));// 填充数据
for (int x=0; x<nx; ++x) {for (int y=0; y<ny; ++y) {double dx = 10.0*x/(nx-1);double dy = 10.0*y/(ny-1);double value = sin(dx)*cos(dy);colorMap->data()->setCell(x, y, value);}
}// 设置颜色渐变
colorMap->setGradient(QCPColorGradient::gpThermal);// 添加色标
QCPColorScale *colorScale = new QCPColorScale(customPlot);
customPlot->plotLayout()->addElement(0, 1, colorScale);
colorScale->setType(QCPAxis::atRight);
colorMap->setColorScale(colorScale);// 设置轴标签
customPlot->xAxis->setLabel("X Axis");
customPlot->yAxis->setLabel("Y Axis");
colorScale->axis()->setLabel("Value");// 自动调整范围
colorMap->rescaleDataRange();
customPlot->rescaleAxes();// 刷新显示
customPlot->replot();
六、高级功能示例
1. 自定义颜色渐变
cpp
// 创建自定义渐变
QCPColorGradient customGradient;
customGradient.setColorStopAt(0.0, Qt::blue);
customGradient.setColorStopAt(0.5, Qt::green);
customGradient.setColorStopAt(1.0, Qt::red);
colorMap->setGradient(customGradient);// 设置渐变类型 (线性/对数)
colorMap->setGradient(QCPColorGradient::gpThermal);
colorMap->gradient().setNanColor(Qt::gray); // 设置NaN值的颜色
2. 实时更新数据
cpp
// 创建定时器更新数据
QTimer *timer = new QTimer(this);
connect(timer, &QTimer::timeout, [=](){static double phase = 0;phase += 0.1;// 更新数据for (int x=0; x<nx; ++x) {for (int y=0; y<ny; ++y) {double dx = 10.0*x/(nx-1);double dy = 10.0*y/(ny-1);double value = sin(dx + phase)*cos(dy + phase);colorMap->data()->setCell(x, y, value);}}colorMap->rescaleDataRange();customPlot->replot();
});
timer->start(100); // 每100ms更新一次
3. 添加数据选择交互
cpp
// 启用选择
colorMap->setSelectable(QCP::stSingleData);// 连接选择信号
connect(customPlot, &QCustomPlot::plottableClick, [=](QCPAbstractPlottable *plottable, int dataIndex){if (plottable == colorMap) {int x, y;colorMap->data()->indexToCell(dataIndex, x, y);double key = colorMap->data()->keyRange().lower + x*colorMap->data()->keyRange().size()/colorMap->data()->keySize();double value = colorMap->data()->valueRange().lower + y*colorMap->data()->valueRange().size()/colorMap->data()->valueSize();double z = colorMap->data()->cell(x, y);qDebug() << "点击位置: (" << key << "," << value << ") 值: " << z;}
});
七、性能优化技巧
-
数据分块处理:
cpp
// 对于大数据集,分块处理 const int blockSize = 100; for (int x=0; x<nx; x+=blockSize) {for (int y=0; y<ny; y+=blockSize) {// 处理当前块...} }
-
关闭抗锯齿:
cpp
colorMap->setAntialiased(false); // 提高渲染性能
-
使用OpenGL加速:
cpp
customPlot->setOpenGl(true); // 启用OpenGL加速
-
限制重绘区域:
cpp
// 只重绘颜色图所在区域 colorMap->layer()->replot();
八、QCPColorMapData 关键方法
方法 | 参数 | 描述 |
---|---|---|
setSize | int keySize, int valueSize | 设置数据矩阵大小 |
setRange | QCPRange keyRange, QCPRange valueRange | 设置数据范围 |
setKeyRange | QCPRange keyRange | 设置键轴范围 |
setValueRange | QCPRange valueRange | 设置值轴范围 |
setCell | int keyIndex, int valueIndex, double z | 设置单个单元格值 |
setData | double key, double value, double z | 通过坐标设置值 |
cellToCoord | int keyIndex, int valueIndex, double *key, double *value | 索引转坐标 |
coordToCell | double key, double value, int *keyIndex, int *valueIndex | 坐标转索引 |
QCPColorMap 是科学数据可视化的强大工具,特别适合显示二维矩阵数据,如温度分布、地形高度、概率密度等。通过合理配置,可以创建出高度定制化的热力图可视化效果。