色谱图QCPColorMap

发布于:2025-04-23 ⋅ 阅读:(66) ⋅ 点赞:(0)

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

七、性能优化技巧

  1. 数据分块处理

    cpp

    // 对于大数据集,分块处理
    const int blockSize = 100;
    for (int x=0; x<nx; x+=blockSize) {
        for (int y=0; y<ny; y+=blockSize) {
            // 处理当前块...
        }
    }
  2. 关闭抗锯齿

    cpp

    colorMap->setAntialiased(false); // 提高渲染性能
  3. 使用OpenGL加速

    cpp

    customPlot->setOpenGl(true); // 启用OpenGL加速
  4. 限制重绘区域

    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 是科学数据可视化的强大工具,特别适合显示二维矩阵数据,如温度分布、地形高度、概率密度等。通过合理配置,可以创建出高度定制化的热力图可视化效果。


网站公告

今日签到

点亮在社区的每一天
去签到