美文网首页
关于QCustomPlot超级图表的一些冷知识点

关于QCustomPlot超级图表的一些冷知识点

作者: feiyangqingyun | 来源:发表于2022-05-29 10:02 被阅读0次

    开源的图表控件QCustomPlot很经典,作者至少是八星斗圣级别,在曲线数据展示这块性能彪悍,总结了一些容易忽略的经验要点。

    • 可以将XY轴对调,然后形成横向的效果,无论是曲线图还是柱状图,分组图、堆积图等,都支持这个特性。
    • 不需要的提示图例可以调用 legend->removeItem 进行移除。
    • 两条曲线可以调用 setChannelFillGraph 设置合并为一个面积区域。
    • 可以关闭抗锯齿 setAntialiased 加快绘制速度。
    • 可以设置不同的线条样式(setLineStyle)、数据样式(setScatterStyle)。
    • 坐标轴的箭头样式可更换 setUpperEnding。
    • 可以用 QCPBarsGroup 实现柱状分组图,这个类在官方demo中没有,所以非常容易忽略。
    • V2.0开始支持数据排序设置,默认是交给QCustomPlot排序,也可以设置setData第三个参数为true表示已经排序过,这样可以绘制往回走的曲线。
    • 频繁绘制数据可以设置排队绘制参数 replot(QCustomPlot::rpQueuedReplot),可以避免重复的replot和提高性能。如果不开启很可能绘制出错。
    //对调XY轴,在最前面设置
    QCPAxis *yAxis = customPlot->yAxis;
    QCPAxis *xAxis = customPlot->xAxis;
    customPlot->xAxis = yAxis;
    customPlot->yAxis = xAxis;
    
    //移除图例
    customPlot->legend->removeItem(1);
    
    //合并两个曲线画布形成封闭区域
    customPlot->graph(0)->setChannelFillGraph(customPlot->graph(1));
    
    //关闭抗锯齿以及设置拖动的时候不启用抗锯齿
    customPlot->graph()->setAntialiased(false);
    customPlot->setNoAntialiasingOnDrag(true);
    
    //多种设置数据的方法
    customPlot->graph(0)->setData();
    customPlot->graph(0)->data()->set();
    
    //设置不同的线条样式、数据样式
    customPlot->graph()->setLineStyle(QCPGraph::lsLine);
    customPlot->graph()->setScatterStyle(QCPScatterStyle::ssDot);
    customPlot->graph()->setScatterStyle(QCPScatterStyle(shapes.at(i), 10));
    
    //还可以设置为图片或者自定义形状
    customPlot->graph()->setScatterStyle(QCPScatterStyle(QPixmap("./sun.png")));
    QPainterPath customScatterPath;
    for (int i = 0; i < 3; ++i) {
        customScatterPath.cubicTo(qCos(2 * M_PI * i / 3.0) * 9, qSin(2 * M_PI * i / 3.0) * 9, qCos(2 * M_PI * (i + 0.9) / 3.0) * 9, qSin(2 * M_PI * (i + 0.9) / 3.0) * 9, 0, 0);
    }
    customPlot->graph()->setScatterStyle(QCPScatterStyle(customScatterPath, QPen(Qt::black, 0), QColor(40, 70, 255, 50), 10));
    
    //更换坐标轴的箭头样式
    customPlot->xAxis->setUpperEnding(QCPLineEnding::esSpikeArrow);
    customPlot->yAxis->setUpperEnding(QCPLineEnding::esSpikeArrow);
    
    //设置背景图片
    customPlot->axisRect()->setBackground(QPixmap("./solarpanels.jpg"));
    //画布也可以设置背景图片
    customPlot->graph(0)->setBrush(QBrush(QPixmap("./balboa.jpg")));
    //整体可以设置填充颜色或者图片
    customPlot->setBackground(QBrush(gradient));
    //设置零点线条颜色
    customPlot->xAxis->grid()->setZeroLinePen(Qt::NoPen);
    //控制是否鼠标滚轮缩放拖动等交互形式
    customPlot->setInteractions(QCP::iRangeDrag | QCP::iRangeZoom | QCP::iSelectPlottables);
    
    //柱状分组图
    QCPBarsGroup *group = new QCPBarsGroup(customPlot);
    QList<QCPBars*> bars;
    bars << fossil << nuclear << regen;
    foreach (QCPBars *bar, bars) {
        //设置柱状图的宽度大小
        bar->setWidth(bar->width() / bars.size());
        group->append(bar);
    }
    //设置分组之间的间隔
    group->setSpacing(2);
    
    //绘制往回走的曲线
    QVector<double> keys, values;
    keys << 0 << 1 << 2 << 3 << 4 << 5 << 4 << 3;
    values << 5 << 4 << 6 << 7 << 7 << 6 << 5 << 4;
    customPlot->graph(0)->setData(keys, values, true);
    
    //频繁绘制数据开启排队绘制可以提高性能
    customPlot->replot(QCustomPlot::rpQueuedReplot);
    
    QCPAxis *axis = customPlot->xAxis;
    double lower = axis->range().lower;
    double upper = axis->range().upper;
    double origin = (upper - lower) / 2;
    //设置刻度线按照设置优先而不是可读性优先
    axis->ticker()->setTickStepStrategy(QCPAxisTicker::tssMeetTickCount);
    //设置原点值为范围值的中心点
    axis->ticker()->setTickOrigin(origin);
    
    QQ截图20220529094415.jpg

    相关文章

      网友评论

          本文标题:关于QCustomPlot超级图表的一些冷知识点

          本文链接:https://www.haomeiwen.com/subject/mbrgprtx.html