开源的图表控件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);

cqb基础知识图解(关于QCustomPlot超级图表的一些冷知识点)(1)

,