赞
踩
曲线面积图其实就是在曲线图上增加了颜色填充,单纯的曲线可能就只有线条以及数据点,面积图则需要从坐标轴的左下角和右下角联合曲线形成完整的封闭区域路径,然后对这个路径进行颜色填充,为了更美观的效果,一般这个填充颜色采用曲线条颜色的透明度值150绘制,看起来更具科幻感,面积图和折线图类似都可以重叠绘制多条,每条都可以是不同的颜色,如果数据点不较少的情况下,还可以开启是否绘制数据值,开启的话直接居中区域绘制对应的数据值。
为了更方便的使用二次开发改造的QCustomPlot,重命名了一些数据类型,比如曲线图中的数据队列一般有QVector,每次写好多地方,可以重命名数据类型更短,写起来更方便,还有就是针对一些曲线数据和属性设置,定义成一个个数据结构体,在设置数据的时候只要先对结构体数据一个个设置好,最后一次性设置就行,参数看起来很短,最早期采用的分开的参数设置,搞得整个函数参数真多,比如曲线的名称、坐标数据集合、线条宽度、线条颜色、数据点形状、线条样式、是否平滑曲线等一大堆参数,有时候突然用户又新增一个要求又要增加一个参数,索性改成结构体数据存储,这下清爽多了,增加个参数要改动的代码量小很多,也更方便阅读。
关于QCustomPlot曲线图本身是不提供平滑曲线的,在这点上不得不承认Qt自带的QChart是完爆QCustomPlot的,不仅有平滑曲线,还有各种切换动画效果,看起来丝丝滑滑,数据平滑过渡一直往前进的感觉。在自定义QCustomPlot控件的时候就考虑到了这个问题,不改变QCustomPlot本身源码的要求下,即可以是折线图也可以是平滑曲线图,平滑算法还有多种,比如采用Qt自带的贝塞尔曲线cubicTo函数来形成平滑路径,另外一种是网上找的开源的计算方法,两种对比下来最明显的区别就是一个峰更陡峭,甚至超过了对应的数据点,类似于有个惯性的感觉,线条滑的很厉害的时候刹车刹不住,还要惯性滑动一段路径。
公众号:Qt实战,各种开源作品、经验整理、项目实战技巧,专注Qt/C++软件开发,视频监控、物联网、工业控制、嵌入式软件、国产化系统应用软件开发。
公众号:Qt入门和进阶,专门介绍Qt/C++相关知识点学习,帮助Qt开发者更好的深入学习Qt。多位Qt元婴期大神,一步步带你从入门到进阶,走上财务自由之路。
官方网店:https://shop114595942.taobao.com/
在线文档:http://www.qtcdev.com/bigscreen/
#include "frmplotarea.h"
#include "ui_frmplotarea.h"
#include "quihelper.h"
frmPlotArea::frmPlotArea(QWidget *parent) : QWidget(parent), ui(new Ui::frmPlotArea)
{
ui->setupUi(this);
this->initForm();
this->loadPlot1();
this->loadPlot2();
this->loadPlot3();
}
frmPlotArea::~frmPlotArea()
{
delete ui;
}
void frmPlotArea::initForm()
{
//设置X轴偏移值0
ui->customPlot1->setOffsetX(0);
//初始化跟随鼠标游标
ui->customPlot1->initTracer();
//设置游标线条颜色
ui->customPlot1->setLineColor("#A279C5");
//设置显示横线+竖线
//ui->customPlot1->setShowLineh(true);
//ui->customPlot1->setShowLinev(true);
//绑定双击重新加载数据
connect(ui->customPlot1->getPlot(), SIGNAL(mouseDoubleClick(QMouseEvent *)), this, SLOT(loadPlot1()));
connect(ui->customPlot2->getPlot(), SIGNAL(mouseDoubleClick(QMouseEvent *)), this, SLOT(loadPlot2()));
connect(ui->customPlot3->getPlot(), SIGNAL(mouseDoubleClick(QMouseEvent *)), this, SLOT(loadPlot3()));
}
void frmPlotArea::loadPlot1()
{
loadPlot(0, ui->customPlot1, QColor(50, 185, 207), 3, false);
}
void frmPlotArea::loadPlot2()
{
loadPlot(1, ui->customPlot2, QColor(162, 121, 197), 3, false);
}
void frmPlotArea::loadPlot3()
{
loadPlot(1, ui->customPlot3, QColor(253, 139, 40), 2, true);
}
//smoothType: 折线图=-1 平滑算法1=0 平滑算法2=1
void frmPlotArea::loadPlot(int smoothType, CustomPlot *customPlot, const QColor &color, int dataWidth, bool drawValue)
{
//清空画布
customPlot->clear();
QStringList lineNames;
lineNames << "合格率";
//初始化对应的数据
vstring lab;
vdouble key, value1;
int dataCount = 15;
for (int i = 0; i < dataCount; i++) {
lab << QString("%1").arg(i + 1);
key << i;
value1 << CustomPlotHelper::getRandValue(30, 80);
}
lvdouble values;
values << value1;
customPlot->setPadding(9);
//设置数据结构体
LineData data;
data.index = 0;
data.name = lineNames.at(0);
data.key = key;
data.value = values.at(0);
//设置线条颜色,可以指定颜色也可以随机颜色
data.lineColor = color;
data.fillColor = 1;
//折线图或者平滑曲线
if (smoothType < 0) {
//添加画布
customPlot->addGraph(1);
//初始化指示器数据高亮及悬停提示等
customPlot->initItem();
//设置画布折线图数据
customPlot->setDataLine(data);
} else {
//有多种平滑算法 0 1
data.smoothType = smoothType;
vpoint points;
int count = key.count();
for (int i = 0; i < count; ++i) {
points << QPointF(data.key.at(i), data.value.at(i));
}
data.points = points;
//设置数据宽度
data.dataWidth = dataWidth;
//设置绘制数据值
data.drawValue = drawValue;
customPlot->addSmoothLine(data);
}
//设置坐标轴范围值+X坐标对应显示文字
customPlot->setLabX(key, lab);
customPlot->setRangeX(-0.5, key.count() - 0.5);
customPlot->setRangeY(0, 105, 10);
//重新刷新显示
customPlot->replot();
}
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。